Como se indica aquí: evento de cambio de texto UITextField , parece que a partir de iOS 6 (iOS 6.0 y 6.1 verificado) no es posible detectar completamente los cambios en los UITextField
objetos simplemente observando el UITextFieldTextDidChangeNotification
.
Parece que ahora solo se rastrean los cambios realizados directamente por el teclado iOS incorporado. Esto significa que si cambia su UITextField
objeto simplemente invocando algo como esto: myUITextField.text = @"any_text"
no se le notificará ningún cambio.
No sé si esto es un error o si está destinado. Parece un error ya que no he encontrado ninguna explicación razonable en la documentación. Esto también se indica aquí: evento de cambio de texto UITextField .
Mi "solución" para esto es publicar una notificación por mí mismo por cada cambio que realice en mi UITextField
(si ese cambio se realiza sin usar el teclado iOS incorporado). Algo como esto:
myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";
NSNotification *myTextFieldUpdateNotification =
[NSNotification notificationWithName:UITextFieldTextDidChangeNotification
object:myUITextField];
[NSNotificationCenter.defaultCenter
postNotification:myTextFieldUpdateNotification];
De esta manera, está 100% seguro de que recibirá la misma notificación cuando cambie la .text
propiedad de suUITextField
objeto, ya sea cuando lo actualice "manualmente" en su código o mediante el teclado iOS incorporado.
Es importante tener en cuenta que, dado que este no es un comportamiento documentado, este enfoque puede dar lugar a 2 notificaciones recibidas para el mismo cambio en su UITextField
objeto. Dependiendo de sus necesidades (lo que realmente hace cuando UITextField.text
cambia), esto podría ser un inconveniente para usted.
Un enfoque ligeramente diferente sería publicar una notificación personalizada (es decir, con un nombre personalizado diferente a UITextFieldTextDidChangeNotification
) si realmente necesita saber si la notificación fue suya o "hecha por iOS".
EDITAR:
Acabo de encontrar un enfoque diferente que creo que podría ser mejor:
Esto implica la característica de Observación de valores clave (KVO) de Objective-C ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid / 10000177-BCICJDHA ).
Básicamente, usted se registra como observador de una propiedad y si esta propiedad cambia, se le notificará al respecto. El "principio" es bastante similar a cómo NSNotificationCenter
funciona, siendo la principal ventaja de que este enfoque funciona automáticamente también a partir de iOS 6 (sin ningún ajuste especial como tener que publicar notificaciones manualmente).
Para nuestro UITextField
-scenario, esto funciona bien si agrega este código a, por ejemplo, el UIViewController
que contiene el campo de texto:
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édito a esta respuesta con respecto a la gestión del "contexto": https://stackoverflow.com/a/12097161/2078512
Nota: Parece que mientras está en el proceso de editar un UITextField
con el teclado iOS incorporado, la propiedad "texto" del campo de texto no se actualiza con cada nueva letra escrita / eliminada. En cambio, el objeto de campo de texto se actualiza "en su conjunto" después de que renuncia al primer estado de respuesta del campo de texto.