使用UITextfield的setText时,UIControlEventEditingChanged不会被触发
我目前正在试图追踪文本字段的状态。
我正在使用通过-setText
设置文本的自定义-setText
[self.textField setText:[self.dateFormatter stringFromDate:self.date]];
在我的textFieldDelegate里面,我写了下面的代码:
-(void)viewDidLoad { [super viewDidLoad]; self.travelToOnTextField.delegate = self; [self.travelToOnTextField addTarget:self action:@selector(travelToOnTextFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; } -(void)travelToOnTextFieldDidChange:(id)sender { NSLog(@"Event Handler called"); }
如果通过我的自定义travelToOnDateTextFieldDidChange
更改文本方法travelToOnDateTextFieldDidChange
不会被调用。 但是,如果我使用我的电脑键盘更改文本,会因为某种原因而被调用。
这是故意的吗?
我不得不评价这个问题,因为这是非常重要的。
看来这在iOS6中已经改变了。 也许甚至是iOS5。 这个事件被用作观察UITextField中文本变化的首选方法。 自iOS3以来,我一直在使用它。 在iOS6上重新编译我的应用程序以执行一些更新后,它神秘地停止工作。 我的应用程序的部分使用:
[UITextField insertText];
和其他人使用
[UITextField setText];
要么
UITextField.text = @"xxx";
无论出于何种原因,请注意setText事件不再触发Editing Changed事件。 如果您使用insertText方法,它仍然有效。
所以,如果你处于困境,你只需要一个快速修复,你可以从下面的代码中更改你的代码:
textField.text;
要么
[textField setText:@"xxx"];
至
textField.text = @""; [textField insertText:@"new text"];
这也适用:
[((UITextField*)view) sendActionsForControlEvents:UIControlEventEditingChanged];
我希望这可以帮助某人,因为我浪费了整整一天的时间,试图弄清为什么当我移动到iOS6时,这段代码突然停止工作。
您仍然可以使用NSNotificationCenter。 有关更多信息,请参阅UITextField参考:
只需调用sendActionsForControlEvents:
设置文本后:
self.textField.text = xxx; [self.textField sendActionsForControlEvents:UIControlEventEditingChanged];
在iOS 9上testing
该文件说:
UIControlEventEditingChanged A touch making an editing change in a UITextField objet. Available in iOS 2.0 and later. Declared in UIControl.h.
只有触摸 ?
在Swift 2.2+中,基于@ Shaolo的回答
- 连接IBAction,注意将默认事件types更改为
EditingChanged
-
从代码更改textField的文本后,还要添加sendActionsLine
taskTextField.text = nil taskTextField.sendActionsForControlEvents(UIControlEvents.EditingChanged)