Как указано здесь: Событие изменения текста UITextField , похоже, что с iOS 6 (проверено iOS 6.0 и 6.1) невозможно полностью обнаружить изменения в UITextField
объекты просто наблюдая за UITextFieldTextDidChangeNotification
.
Кажется, что теперь отслеживаются только те изменения, которые были сделаны непосредственно встроенной клавиатурой iOS. Это означает, что если вы измените свой UITextField
объект, просто вызвав что-то вроде этого: myUITextField.text = @"any_text"
, вы вообще не будете уведомлены о каких-либо изменениях.
Я не знаю, если это ошибка или она предназначена. Похоже, ошибка, так как я не нашел разумного объяснения в документации. Здесь также указано: Событие изменения текста UITextField .
Мое «решение» этого заключается в том, чтобы на самом деле публиковать уведомление самостоятельно для каждого изменения, которое я делаю в UITextField
(если это изменение выполняется без использования встроенной клавиатуры iOS). Примерно так:
myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";
NSNotification *myTextFieldUpdateNotification =
[NSNotification notificationWithName:UITextFieldTextDidChangeNotification
object:myUITextField];
[NSNotificationCenter.defaultCenter
postNotification:myTextFieldUpdateNotification];
Таким образом, вы на 100% уверены, что получите такое же уведомление при изменении свойства .text
вашего UITextField
объекта, либо когда вы обновите его «вручную» в своем коде, либо через встроенный клавиатура iOS.
Важно учитывать, что, поскольку это не задокументированное поведение, такой подход может привести к получению 2 уведомлений об одном и том же изменении в вашем UITextField
объекте. В зависимости от ваших потребностей (что вы на самом деле делаете, когда меняется UITextField.text
), это может быть неудобно для вас.
Несколько иной подход заключается в публикации пользовательского уведомления (то есть с пользовательским именем, отличным от UITextFieldTextDidChangeNotification
), если вам действительно нужно знать, было ли это уведомление вашим или "созданным на iOS".
EDIT:
Я только что нашел другой подход, который, я думаю, мог бы быть лучше:
Это включает в себя Наблюдение значения ключа (KVO) функция Objective-C (http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177-BCICJDHA).
По сути, вы регистрируетесь как наблюдатель собственности, и если это свойство изменяется, вы получаете уведомление об этом. «Принцип» очень похож на то, как работает NSNotificationCenter
, и является главным преимуществом, заключающимся в том, что этот подход работает автоматически также и в iOS 6 (без какой-либо специальной настройки, например необходимости вручную отправлять уведомления).
Для нашего UITextField
-сценария это прекрасно работает, если вы добавите этот код, например, в ваш UIViewController
, который содержит текстовое поле:
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];
}
Кредит на этот ответ относительно "контекстного" управления: https://stackoverflow.com/a/12097161/2078512
Примечание. Похоже, что когда вы выполняете редактирование UITextField
с помощью встроенной клавиатуры iOS, свойство text в текстовом поле не обновляется при вводе каждой новой буквы. / удалены. Вместо этого объект текстового поля обновляется «как единое целое» после того, как вы отказываетесь от статуса первого респондента текстового поля.