Wie hier angegeben: UITextField-Textänderungsereignis Es scheint, dass es ab iOS 6 (iOS 6.0 und 6.1 aktiviert) nicht möglich ist, Änderungen an UITextField
Objekten vollständig zu erkennen, wenn Sie nur das beobachten UITextFieldTextDidChangeNotification
.
Es scheint, dass jetzt nur die Änderungen verfolgt werden, die direkt über die integrierte iOS-Tastatur vorgenommen wurden. Dies bedeutet, dass Sie nicht über Änderungen informiert werden , wenn Sie Ihr UITextField
Objekt nur durch Aufrufen von Folgendes ändern : myUITextField.text = @"any_text"
.
Ich weiß nicht, ob dies ein Fehler ist oder beabsichtigt ist. Scheint ein Fehler zu sein, da ich in der Dokumentation keine vernünftige Erklärung gefunden habe. Dies wird auch hier angegeben: UITextField-Textänderungsereignis .
Meine "Lösung" besteht darin, für jede Änderung, die ich an meiner vornehme, eine Benachrichtigung von mir selbst zu veröffentlichen UITextField
(wenn diese Änderung ohne Verwendung der integrierten iOS-Tastatur vorgenommen wird). Etwas wie das:
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 dieselbe Benachrichtigung erhalten, wenn Sie die .text
Eigenschaft Ihres UITextField
Objekts ändern , entweder wenn Sie es "manuell" in Ihrem Code aktualisieren oder über die integrierte iOS-Tastatur.
Da dies kein dokumentiertes Verhalten ist, kann dieser Ansatz dazu führen, dass zwei Benachrichtigungen für dieselbe Änderung in Ihrem UITextField
Objekt empfangen werden. Abhängig von Ihren Anforderungen (was Sie tatsächlich tun, wenn Sie UITextField.text
Änderungen vornehmen) kann dies eine Unannehmlichkeit für Sie sein.
Ein etwas anderer Ansatz wäre das Posten einer benutzerdefinierten Benachrichtigung (dh mit einem anderen benutzerdefinierten Namen als UITextFieldTextDidChangeNotification
), wenn Sie tatsächlich wissen müssen, ob die Benachrichtigung Ihre oder "iOS-made" war.
BEARBEITEN:
Ich habe gerade einen anderen Ansatz gefunden, der meiner Meinung nach besser sein könnte:
Dies beinhaltet die Key-Value Observing (KVO) -Funktion von Objective-C ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid) / 10000177-BCICJDHA ).
Grundsätzlich registrieren Sie sich als Beobachter einer Immobilie und wenn sich diese Eigenschaft ändert, werden Sie darüber informiert. Das "Prinzip" ist der Funktionsweise ziemlich ähnlich. NSNotificationCenter
Dies ist der Hauptvorteil, dass dieser Ansatz auch ab iOS 6 automatisch funktioniert (ohne spezielle Anpassungen wie das manuelle Posten von Benachrichtigungen).
In unserem UITextField
Szenario funktioniert dies einwandfrei, wenn Sie diesen Code beispielsweise zu Ihrem Code hinzufügen UIViewController
, der 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];
}
Gutschrift auf diese Antwort bezüglich "Kontext" -Verwaltung: https://stackoverflow.com/a/12097161/2078512
Hinweis: Scheint , wie während Sie sind in dem Prozess der eine Bearbeitung UITextField
mit dem eingebauten in iOS - Tastatur, die „Text“ Eigenschaft des Textfeldes wird nicht mit jedem neuen Buchstaben aktualisiert getippt / entfernt. Stattdessen wird das Textfeldobjekt "als Ganzes" aktualisiert, nachdem Sie den Ersthelferstatus des Textfelds aufgegeben haben.