如此处所述:UITextField text change event,似乎从 iOS 6(iOS 6.0 和 6.1 检查)开始,UITextField
仅通过观察UITextFieldTextDidChangeNotification
.
现在似乎只跟踪那些由内置 iOS 键盘直接进行的更改。UITextField
这意味着,如果您仅通过调用以下内容来更改对象: myUITextField.text = @"any_text"
,您将不会收到任何更改的通知。
我不知道这是一个错误还是有意为之。似乎是一个错误,因为我在文档中没有找到任何合理的解释。这也在这里说明:UITextField text change event。
我对此的“解决方案”实际上是为我对我所做的每一次更改发布一个通知UITextField
(如果该更改是在不使用内置 iOS 键盘的情况下完成的)。像这样的东西:
myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";
NSNotification *myTextFieldUpdateNotification =
[NSNotification notificationWithName:UITextFieldTextDidChangeNotification
object:myUITextField];
[NSNotificationCenter.defaultCenter
postNotification:myTextFieldUpdateNotification];
这样,当您在代码中“手动”更新对象或通过内置的 iOS 键盘更新对象的.text
属性时,您将 100% 确信您将收到相同的通知。UITextField
重要的是要考虑到,由于这不是记录在案的行为,因此这种方法可能会导致收到 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 键盘编辑 a的过程中,文本字段的“文本”属性不会随着输入/删除的每个新字母而更新。UITextField
相反,在您退出文本字段的第一响应者状态后,文本字段对象会“整体”更新。