Conforme declarado aqui: evento de alteração de texto UITextField , parece que a partir do iOS 6 (iOS 6.0 e 6.1 marcado) não é possível detectar completamente as alterações nos UITextField
objetos apenas observando o UITextFieldTextDidChangeNotification
.
Parece que apenas as alterações feitas diretamente pelo teclado interno do iOS são rastreadas agora. Isso significa que se você alterar seu UITextField
objeto apenas invocando algo como isto:, myUITextField.text = @"any_text"
você não será notificado sobre nenhuma alteração.
Não sei se isso é um bug ou se destina. Parece um bug, pois não encontrei nenhuma explicação razoável na documentação. Isso também é afirmado aqui: Evento de alteração de texto UITextField .
Minha "solução" para isso é realmente postar uma notificação por mim mesmo para cada alteração que fizer no meu UITextField
(se essa alteração for feita sem o uso do teclado iOS incorporado). Algo assim:
myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";
NSNotification *myTextFieldUpdateNotification =
[NSNotification notificationWithName:UITextFieldTextDidChangeNotification
object:myUITextField];
[NSNotificationCenter.defaultCenter
postNotification:myTextFieldUpdateNotification];
Dessa forma, você está 100% confiante de que receberá a mesma notificação quando alterar a .text
propriedade do seuUITextField
objeto, quando o atualizar "manualmente" em seu código ou por meio do teclado iOS incorporado.
É importante considerar que, como esse não é um comportamento documentado, essa abordagem pode levar a duas notificações recebidas pela mesma alteração em seu UITextField
objeto. Dependendo das suas necessidades (o que você realmente faz quando as UITextField.text
alterações são feitas), isso pode ser um inconveniente para você.
Uma abordagem ligeiramente diferente seria postar uma notificação personalizada (ou seja, com um nome personalizado diferente de UITextFieldTextDidChangeNotification
) se você realmente precisar saber se a notificação foi sua ou "feita pelo iOS".
EDITAR:
Acabei de encontrar uma abordagem diferente que eu acho que poderia ser melhor:
Isso envolve o recurso Observação de Valor-Chave (KVO) do Objective-C ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid / 10000177-BCICJDHA ).
Basicamente, você se registra como um observador de uma propriedade e, se essa propriedade mudar, você será notificado. O "princípio" é bastante semelhante ao modo como NSNotificationCenter
funciona, sendo a principal vantagem que essa abordagem funciona automaticamente também no iOS 6 (sem nenhum ajuste especial, como ter que postar notificações manualmente).
Para o nosso UITextField
cenário, isso funciona muito bem se você adicionar esse código, por exemplo, o seu UIViewController
que contém o 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];
}
Os créditos a esta resposta sobre o gerenciamento de "contexto": https://stackoverflow.com/a/12097161/2078512
Nota: Parece que enquanto você está no processo de edição de um UITextField
com o built-in teclado iOS, a propriedade "texto" do campo de texto não é atualizado a cada nova letra digitada / removido. Em vez disso, o objeto do campo de texto é atualizado "como um todo" após você renunciar ao status de primeiro respondedor do campo de texto.