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 UITextField
objets 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 UITextField
objet 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 .text
propriété de votre UITextField
objet, 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 UITextField
objet. Selon vos besoins (ce que vous faites réellement lors de vos UITextField.text
changements), 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 NSNotificationCenter
fonctionne, é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 UITextField
scénario, cela fonctionne très 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 à 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 UITextField
avec 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.