使用UITextfield的setText时,不会触发UIControlEventEditingChanged

Seb*_*ldt 48 cocoa-touch uidatepicker uitextfield ios

我目前正在尝试跟踪文本字段的状态.

我正在使用自定义datePicker来设置文本 -setText

[self.textField setText:[self.dateFormatter stringFromDate:self.date]];
Run Code Online (Sandbox Code Playgroud)

在我的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");
}
Run Code Online (Sandbox Code Playgroud)

如果我通过自定义Datepicker更改文本,travelToOnDateTextFieldDidChange则不会调用Method .但是,如果我使用我的电脑键盘更改文本,它会因某种原因而被调用.

这是故意的吗?

Sha*_*olo 81

我因为这是评价这个问题了超级重要.

看来这在iOS6中已经发生了变化.也许甚至iOS5.此事件USED是在UITextField中观察文本更改的首选方法.我从iOS3开始就一直在使用它.在iOS6上重新编译我的应用程序以执行一些更新后,它神秘地停止工作.我的应用程序部分使用:

[UITextField insertText];
Run Code Online (Sandbox Code Playgroud)

和其他人使用

[UITextField setText];
Run Code Online (Sandbox Code Playgroud)

要么

UITextField.text = @"xxx";
Run Code Online (Sandbox Code Playgroud)

无论出于何种原因,重要的是要注意setText事件不再触发Editing Changed事件.如果使用insertText方法,它仍然有效.

因此,如果您处于绑定状态并且只需要快速修复,则可以从以下位置更改代码:

textField.text;
Run Code Online (Sandbox Code Playgroud)

要么

[textField setText:@"xxx"];
Run Code Online (Sandbox Code Playgroud)

textField.text = @"";
[textField insertText:@"new text"];
Run Code Online (Sandbox Code Playgroud)

这也有效:

[((UITextField*)view) sendActionsForControlEvents:UIControlEventEditingChanged];
Run Code Online (Sandbox Code Playgroud)

我希望这对某人有所帮助,因为我浪费了一整天的时间试图找出为什么当我升级到iOS6时这段代码突然停止工作.

您仍然可以使用NSNotificationCenter.有关更多信息,请参阅UITextField参考:

https://developer.apple.com/documentation/uikit/uitextfield

  • 感谢您的解决方案,我也最终使用了 sendActionsForControlEvents 方法。 (2认同)

Gon*_*Gon 17

sendActionsForControlEvents:设置文本后只需调用:

self.textField.text = xxx;
[self.textField sendActionsForControlEvents:UIControlEventEditingChanged];
Run Code Online (Sandbox Code Playgroud)

在iOS 9上测试过.


zgo*_*ski 5

在Swift 2.2+中,基于@Shaolo的答案

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

在此处输入图片说明

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

    taskTextField.text = nil
    taskTextField.sendActionsForControlEvents(UIControlEvents.EditingChanged)
    
    Run Code Online (Sandbox Code Playgroud)


gay*_*nbc 5

更新:斯威夫特 4.2

textField.text = "some Text"
textField.sendActions(for: UIControl.Event.editingChanged)
Run Code Online (Sandbox Code Playgroud)