Як зазначено тут: подія зміни тексту 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.
Важливо врахувати, що оскільки це не документально підтверджена поведінка, такий підхід може призвести до отримання двох повідомлень про однакову зміну вашого UITextField
об’єкта. Залежно від ваших потреб (що ви насправді робите під час UITextField.text
змін), це може бути незручністю для вас.
Трохи іншим підходом буде розміщення спеціального сповіщення (це власне ім'я, відмінне від UITextFieldTextDidChangeNotification
), якщо вам потрібно знати, чи було сповіщення вашим чи "iOS-made".
Редагувати:
Щойно я знайшов інший підхід, який, на мою думку, міг би бути кращим:
Сюди входить особливість спостереження ключових значень (KVO) об'єктива-C ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid / 10000177-BCICJDHA ).
В основному ви реєструєте себе як спостерігач власності, і якщо ця власність зміниться, ви отримаєте сповіщення про неї. "Принцип" досить схожий на те, як NSNotificationCenter
працює, головна перевага в тому, що цей підхід працює автоматично також, як і в iOS 6 (без будь-яких спеціальних налаштувань, як, наприклад, вручну розміщувати повідомлення).
Для нашого UITextField
-scenario це працює чудово, якщо ви додасте цей код, наприклад, до вашого, 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 клавіатури, властивість «текст» текстового поля не оновлюється з кожним новим листом , набраними / видалено. Натомість об’єкт текстового поля оновлюється "в цілому" після відставки статусу першого текстового поля першого відповіді.