使用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参考:

https://developer.apple.com/documentation/uikit/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的回答

  1. 连接IBAction,注意将默认事件types更改为EditingChanged

在这里输入图像说明

  1. 从代码更改textField的文本后,还要添加sendActionsLine

     taskTextField.text = nil taskTextField.sendActionsForControlEvents(UIControlEvents.EditingChanged)