Comme indiqué ici: UITextField changement de texte de l'événement, il semble que comme d'iOS 6 (iOS 6.0 et 6.1 vérifié) il n'est pas possible de détecter les changements dans UITextField
des objets simplement par l'observation de l' UITextFieldTextDidChangeNotification
.
Il semble que seuls les changements effectués directement par le haut-clavier iOS sont suivis maintenant. Cela signifie que si vous changez d' UITextField
objet juste en invoquant quelque chose comme ceci: myUITextField.text = @"any_text"
, vous ne serez pas averti de tout changement à tous.
Je ne sais pas si c'est un bug ou c'est prévu. Semble comme un bug car je n'ai pas trouvé d'explication raisonnable dans la documentation. C'est aussi indiqué ici: UITextField texte de modifier l'événement.
Ma "solution" à ce, est en fait de publier une notification par moi-même pour tous les changement que j'ai fait à ma UITextField
(si ce changement se fait sans l'aide de l'intégré dans le clavier iOS). Quelque chose comme ceci:
myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";
NSNotification *myTextFieldUpdateNotification =
[NSNotification notificationWithName:UITextFieldTextDidChangeNotification
object:myUITextField];
[NSNotificationCenter.defaultCenter
postNotification:myTextFieldUpdateNotification];
De cette façon, vous êtes confiant à 100% que vous recevrez la même notification lorsque vous modifiez l' .text
de la propriété de votre UITextField
objet, soit lors de la mise à jour "manuellement" dans votre code ou par le biais de l'intégré dans le clavier iOS.
Il est important de considérer que, puisque ce n'est pas un comportement documenté, cette approche peut conduire à 2 notifications reçues pour le même changement dans votre UITextField
objet. En fonction de vos besoins (ce que vous faites quand votre UITextField.text
des changements) ce pourrait être un inconvénient pour vous.
Une approche légèrement différente serait de poster une coutume de notification (ce qui est, avec un nom personnalisé autre que UITextFieldTextDidChangeNotification
) si vous avez réellement besoin de savoir si la notification a été le vôtre ou "iOS".
EDIT:
Je viens de trouver une approche différente, qui je pense pourrait être mieux:
Cela implique la Clé-Valeur d'Observation (KVO) fonction d'Objective-C (http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177-BCICJDHA).
Essentiellement, vous devez vous inscrire vous-même comme un observateur de la propriété et si cette propriété modifications que vous soyez informé à ce sujet. Le "principe" est tout à fait similaire à la façon dont NSNotificationCenter
œuvres, le principal avantage de cette approche fonctionne aussi comme de l'iOS 6 (sans le tordre comme ayant à la main poster des notifications).
Pour notre UITextField
-scénario cela fonctionne bien si vous ajoutez ce code, par exemple, votre UIViewController
qui contient le champ de texte:
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];
}
Crédit pour cette réponse concernant le "contexte" de la gestion: http://stackoverflow.com/a/12097161/2078512
Note: il Semble que lorsque vous êtes dans le processus de modification d'un UITextField
intégré dans iOS clavier, le "texte" de la propriété du champ de texte n'est pas mis à jour avec chaque nouvelle lettre dactylographiée/supprimé. Au lieu de cela, l'objet de champ de texte est mise à jour "dans son ensemble" après la démission du premier répondant état du champ de texte.