Burada belirtildiği gibi: UITextField metin değişikliği olayı , iOS 6'dan (iOS 6.0 ve 6.1 kontrol edildi), UITextField
nesnelerdeki değişiklikleri sadece gözlemleyerek tam olarak tespit etmek mümkün görünmüyor UITextFieldTextDidChangeNotification
.
Görünüşe göre, yalnızca doğrudan yerleşik iOS klavyesi tarafından yapılan değişiklikler takip ediliyor. Bu, UITextField
nesnenizi yalnızca şöyle bir şey çağırarak değiştirirseniz : myUITextField.text = @"any_text"
hiçbir değişiklik hakkında bilgilendirilmeyeceğiniz anlamına gelir .
Bunun bir hata olup olmadığını veya amaçlandığını bilmiyorum. Belgelerde makul bir açıklama bulamadığım için bir hata gibi görünüyor. Bu burada da belirtilir: UITextField metin değiştirme olayı .
Benim "çözümüm" aslında yaptığım her değişiklik için kendim bir bildirim göndermektir UITextField
(eğer bu değişiklik yerleşik iOS klavyesini kullanmadan yapılırsa). Bunun gibi bir şey:
myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";
NSNotification *myTextFieldUpdateNotification =
[NSNotification notificationWithName:UITextFieldTextDidChangeNotification
object:myUITextField];
[NSNotificationCenter.defaultCenter
postNotification:myTextFieldUpdateNotification];
Bu şekilde .text
, UITextField
nesnenizin özelliğini değiştirdiğinizde, kodunuzda "manuel olarak" güncellediğinizde veya yerleşik iOS klavyesi ile aynı bildirimi alacağınızdan% 100 emin olabilirsiniz .
Bu, belgelenmiş bir davranış olmadığından, bu yaklaşımın UITextField
nesnenizdeki aynı değişiklik için alınan 2 bildirime yol açabileceğini düşünmek önemlidir . İhtiyaçlarınıza bağlı olarak ( UITextField.text
değişikliklerinizde gerçekten ne yaptığınız) bu sizin için bir rahatsızlık olabilir.
Bildirimin UITextFieldTextDidChangeNotification
size ait olup olmadığını veya "iOS yapımı" olup olmadığını gerçekten bilmeniz gerekiyorsa, biraz farklı bir yaklaşım özel bir bildirim yayınlamaktır (bu, farklı bir adla ).
DÜZENLE:
Daha iyi olabileceğini düşündüğüm farklı bir yaklaşım buldum:
Bu, Objective-C'nin Anahtar Değeri Gözlemleme (KVO) özelliğini içerir ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid / 10000177-BCICJDHA ).
Temel olarak, kendinizi bir mülkün gözlemcisi olarak kaydedersiniz ve bu özellik değişirse bu konuda bilgilendirilirsiniz. "Prensip" nasıl NSNotificationCenter
çalıştığına oldukça benzer , bu yaklaşımın iOS 6'dan itibaren otomatik olarak da çalışmasının ana avantajıdır (bildirimleri manuel olarak göndermek zorunda kalmadan özel bir değişiklik yapmadan).
Bizim için UITextField
senin örneğin, bu kodu eklerseniz bu sadece çalışıyor -scenario, UIViewController
metin alanı içerir:
static void *myContext = &myContext;
- (void)viewDidLoad {
[super viewDidLoad];
//Observing changes to myUITextField.text:
[myUITextField addObserver:self forKeyPath:@"text"
options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld
context:myContext];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context {
if(context == myContext) {
//Here you get notified every time myUITextField's "text" property is updated
NSLog(@"New value: %@ - Old value: %@",
[change objectForKey:NSKeyValueChangeNewKey],
[change objectForKey:NSKeyValueChangeOldKey]);
}
else
[super observeValueForKeyPath:keyPath ofObject:object
change:change context:context];
}
"Bağlam" yönetimi ile ilgili bu yanıta verilen kredi: https://stackoverflow.com/a/12097161/2078512
Not: iken gibi görünüyor sürecinde bir düzenleme UITextField
yerleşik iOS klavyesi, metin alanının "metin" özelliği her yeni harfle güncelleştirilmezse ile yazdığınız / kaldırıldı. Bunun yerine, metin alanının ilk yanıtlayıcı durumunu bıraktıktan sonra metin alanı nesnesi "bir bütün olarak" güncelleştirilir.