Come indicato qui: evento di modifica del testo UITextField , sembra che a partire da iOS 6 (iOS 6.0 e 6.1 selezionati) non sia possibile rilevare completamente le modifiche negli UITextField
oggetti solo osservando il UITextFieldTextDidChangeNotification
.
Sembra che ora vengano monitorate solo le modifiche apportate direttamente dalla tastiera iOS integrata. Ciò significa che se modifichi il tuo UITextField
oggetto semplicemente invocando qualcosa del genere: myUITextField.text = @"any_text"
non verrai avvisato di eventuali cambiamenti.
Non so se questo è un bug o è previsto. Sembra un bug poiché non ho trovato alcuna spiegazione ragionevole nella documentazione. Questo è indicato anche qui: Evento di modifica del testo UITextField .
La mia "soluzione" a questo è in realtà pubblicare una notifica da solo per ogni modifica UITextField
apportata alla mia (se tale modifica viene eseguita senza utilizzare la tastiera iOS integrata). Qualcosa come questo:
myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";
NSNotification *myTextFieldUpdateNotification =
[NSNotification notificationWithName:UITextFieldTextDidChangeNotification
object:myUITextField];
[NSNotificationCenter.defaultCenter
postNotification:myTextFieldUpdateNotification];
In questo modo sei sicuro al 100% che riceverai la stessa notifica quando cambi la .text
proprietà del tuo UITextField
oggetto, sia quando lo aggiorni "manualmente" nel tuo codice sia attraverso la tastiera iOS integrata.
È importante considerare che, poiché questo non è un comportamento documentato, questo approccio può portare a 2 notifiche ricevute per la stessa modifica UITextField
nell'oggetto. A seconda delle tue esigenze (cosa fai effettivamente quando le tue UITextField.text
modifiche) questo potrebbe essere un inconveniente per te.
Un approccio leggermente diverso sarebbe quello di pubblicare una notifica personalizzata (vale a dire, con un nome personalizzato diverso da UITextFieldTextDidChangeNotification
) se in realtà è necessario sapere se la notifica è stata tua o "iOS-made".
MODIFICARE:
Ho appena trovato un approccio diverso che penso potrebbe essere migliore:
Implica la funzionalità KVO (Key-Value Observing) di Objective-C ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid / 10000177-BCICJDHA ).
Fondamentalmente, ti registri come osservatore di una proprietà e se questa proprietà cambia, ne ricevi una notifica. Il "principio" è abbastanza simile a come NSNotificationCenter
funziona, essendo il principale vantaggio che questo approccio funziona automaticamente anche a partire da iOS 6 (senza particolari modifiche come la necessità di pubblicare manualmente le notifiche).
Per il nostro UITextField
-scenario funziona perfettamente se aggiungi questo codice, ad esempio, al tuo UIViewController
che contiene il campo di testo:
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];
}
Ringraziamo questa risposta relativa alla gestione del "contesto": https://stackoverflow.com/a/12097161/2078512
Nota: Sembra che mentre si è in procinto di modifica di un UITextField
con la tastiera integrata iOS, il "testo" di proprietà del campo di testo non viene aggiornato ad ogni nuova lettera digitata / rimosso. Al contrario, l'oggetto del campo di testo viene aggiornato "nel suo insieme" dopo aver rassegnato le dimissioni al primo stato di risposta del campo di testo.