Как указано здесь: событие изменения текста 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».
РЕДАКТИРОВАТЬ:
Я только что нашел другой подход, который, я думаю, мог бы быть лучше:
Это включает функцию наблюдения значения ключа (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 свойство «текст» текстового поля не обновляется при вводе / удалении каждой новой буквы. Вместо этого объект текстового поля обновляется «в целом» после того, как вы отказываетесь от статуса первого респондента текстового поля.