Comme indiqué ici: Événement de changement de texte UITextField , il semble qu'à partir d'iOS 6 (iOS 6.0 et 6.1 vérifié), il n'est pas possible de détecter complètement les changements dans les UITextFieldobjets simplement en observant le UITextFieldTextDidChangeNotification.
Il semble que seules les modifications apportées directement par le clavier iOS intégré soient suivies maintenant. Cela signifie que si vous changez votre UITextFieldobjet simplement en invoquant quelque chose comme ceci:, myUITextField.text = @"any_text"vous ne serez pas du tout informé des changements.
Je ne sais pas si c'est un bug ou si c'est prévu. Cela ressemble à un bug car je n'ai trouvé aucune explication raisonnable dans la documentation. Ceci est également indiqué ici: événement de changement de texte UITextField .
Ma «solution» à cela consiste à publier une notification par moi-même pour chaque modification que j'apporte à mon UITextField(si cette modification est effectuée sans utiliser le clavier iOS intégré). Quelque chose comme ça:
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 sûr à 100% que vous recevrez la même notification lorsque vous modifiez la .textpropriété de votre UITextFieldobjet, soit lorsque vous le mettez à jour "manuellement" dans votre code, soit via le clavier iOS intégré.
Il est important de considérer que, comme ce n'est pas un comportement documenté, cette approche peut conduire à 2 notifications reçues pour le même changement dans votre UITextFieldobjet. Selon vos besoins (ce que vous faites réellement lors de vos UITextField.textchangements), cela pourrait vous être gênant.
Une approche légèrement différente consisterait à publier une notification personnalisée (c'est-à-dire avec un nom personnalisé autre que UITextFieldTextDidChangeNotification) si vous avez réellement besoin de savoir si la notification était la vôtre ou "conçue par iOS".
ÉDITER:
Je viens de trouver une approche différente qui, je pense, pourrait être meilleure:
Cela implique la fonctionnalité Key-Value Observing (KVO) d'Objective-C ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid / 10000177-BCICJDHA ).
Fondamentalement, vous vous enregistrez en tant qu'observateur d'une propriété et si cette propriété change, vous en êtes informé. Le "principe" est assez similaire à la façon dont NSNotificationCenterfonctionne, étant le principal avantage que cette approche fonctionne automatiquement aussi à partir d'iOS 6 (sans aucun ajustement spécial comme devoir publier manuellement des notifications).
Pour notre UITextFieldscénario, cela fonctionne très bien si vous ajoutez ce code, par exemple, à votre UIViewControllerqui 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 à cette réponse concernant la gestion du "contexte": https://stackoverflow.com/a/12097161/2078512
Remarque: Il semble que lorsque vous êtes en train de modifier un UITextFieldavec le clavier iOS intégré, la propriété "texte" du champ de texte n'est pas mise à jour à chaque nouvelle lettre tapée / supprimée. Au lieu de cela, l'objet de champ de texte est mis à jour "dans son ensemble" après avoir démissionné du statut de premier répondant du champ de texte.