如此处所述: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制作的”,则稍有不同的方法是发布自定义通知(即使用以外的其他自定义名称)。
编辑:
我刚刚找到了一种我认为可能更好的方法:
这涉及到Objective-C 的键值观察(KVO)功能(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
注意:好像您正在使用内置的iOS键盘进行编辑时UITextField
,并非每次键入/删除新字母都会更新文本字段的“ text”属性。相反,在您退出文本字段的第一响应者状态后,文本字段对象将“作为一个整体”进行更新。