Wie hier angegeben: UITextField Textänderung Ereignis scheint es, dass ab iOS 6 (iOS 6.0 und 6.1 geprüft) ist es nicht möglich, die Änderungen in UITextField
Objekte nur durch Beobachtung der UITextFieldTextDidChangeNotification
.
Es scheint, dass nur die Änderungen, die direkt über die eingebaute iOS-Tastatur vorgenommen werden, aufgezeichnet werden. Das bedeutet, dass Sie, wenn Sie Ihre UITextField
Objekts, indem Sie einfach etwas wie dieses aufrufen: myUITextField.text = @"any_text"
werden Sie über keinerlei Änderungen benachrichtigt.
Ich weiß nicht, ob dies ein Fehler ist oder beabsichtigt ist. Es scheint ein Fehler zu sein, da ich keine vernünftige Erklärung in der Dokumentation gefunden habe. Dies ist auch hier angegeben: UITextField Textänderung Ereignis .
Meine "Lösung" für dieses Problem besteht darin, dass ich für jede Änderung, die ich an meiner Website vornehme, selbst eine Benachrichtigung verschicke. UITextField
(wenn diese Änderung ohne Verwendung der eingebauten iOS-Tastatur vorgenommen wird). Etwa so:
myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";
NSNotification *myTextFieldUpdateNotification =
[NSNotification notificationWithName:UITextFieldTextDidChangeNotification
object:myUITextField];
[NSNotificationCenter.defaultCenter
postNotification:myTextFieldUpdateNotification];
Auf diese Weise können Sie zu 100 % sicher sein, dass Sie die gleiche Benachrichtigung erhalten, wenn Sie die .text
Eigentum Ihrer UITextField
Objekts, entweder wenn Sie es "manuell" in Ihrem Code oder über die integrierte iOS-Tastatur aktualisieren.
Da dieses Verhalten nicht dokumentiert ist, ist es wichtig zu bedenken, dass dieser Ansatz dazu führen kann, dass Sie 2 Benachrichtigungen für dieselbe Änderung in Ihrem UITextField
Objekt. Je nach Ihren Bedürfnissen (was Sie tatsächlich tun, wenn Ihr UITextField.text
Änderungen) könnte dies für Sie eine Unannehmlichkeit darstellen.
Ein etwas anderer Ansatz wäre es, eine benutzerdefinierte Benachrichtigung zu posten (d.h. mit einem anderen Namen als UITextFieldTextDidChangeNotification
), wenn Sie tatsächlich wissen müssen, ob die Meldung von Ihnen stammt oder von iOS gemacht" wurde.
EDIT :
Ich habe gerade einen anderen Ansatz gefunden, der meiner Meinung nach besser sein könnte:
Dies beinhaltet die Schlüssel-Werte-Beobachtung (KVO) Funktion von Objective-C ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177-BCICJDHA ).
Im Grunde registriert man sich als Beobachter einer Eigenschaft, und wenn sich diese Eigenschaft ändert, wird man darüber informiert. Das "Prinzip" ist ganz ähnlich wie bei der NSNotificationCenter
funktioniert, wobei der Hauptvorteil darin besteht, dass dieser Ansatz auch ab iOS 6 automatisch funktioniert (ohne spezielle Anpassungen wie das manuelle Posten von Benachrichtigungen).
Für unsere UITextField
-Szenario funktioniert dies problemlos, wenn Sie diesen Code z. B. in Ihre UIViewController
die das Textfeld enthält:
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];
}
Anerkennung für diese Antwort bezüglich des "Kontext"-Managements: https://stackoverflow.com/a/12097161/2078512
Anmerkung: Es scheint, als ob Sie, während Sie im Verlauf von Bearbeitung einer UITextField
Bei der eingebauten iOS-Tastatur wird die Eigenschaft "Text" des Textfelds nicht mit jedem neu eingegebenen/entfernten Buchstaben aktualisiert. Stattdessen wird das Textfeldobjekt "als Ganzes" aktualisiert, nachdem Sie den Erstbeantworter-Status des Textfelds zurückziehen.