使用 UITextfield 的 setText 时不会触发 UIControlEventEditingChanged

Posted

技术标签:

【中文标题】使用 UITextfield 的 setText 时不会触发 UIControlEventEditingChanged【英文标题】:UIControlEventEditingChanged doesn't get fired when using setText of UITextfield 【发布时间】:2013-02-28 16:03:16 【问题描述】:

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

我正在使用自定义 datePicker,它通过 -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");

如果我通过自定义 Datepicker 更改文本,则不会调用方法 travelToOnDateTextFieldDidChange。但是,如果我使用计算机键盘更改文本,它会因某种原因被调用。

这是故意的吗?

【问题讨论】:

【参考方案1】:

我不得不给这个问题打分,因为这超级很重要。

这似乎在 ios6 中有所改变。甚至可能是iOS5。此事件 USED 成为观察 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 方法。 insertText 不起作用。但是[textField sendActionsForControlEvents:UIControlEventEditingChanged] 有效。 insertText(_:) 应该仅在文本字段是第一响应者时才有效,因为 UIKeyInput 的文档说它在光标位置插入文本。【参考方案2】:

设置文字后直接拨打sendActionsForControlEvents:即可:

self.textField.text = xxx;
[self.textField sendActionsForControlEvents:UIControlEventEditingChanged];

在 iOS 9 上测试。

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

更新:Swift 4.2

textField.text = "some Text"
textField.sendActions(for: UIControl.Event.editingChanged)

【讨论】:

【参考方案5】:

文档说:

UIControlEventEditingChanged 
A touch making an editing change in a UITextField objet. 
Available in iOS 2.0 and later. 
Declared in UIControl.h.

所以只能触摸

【讨论】:

以上是关于使用 UITextfield 的 setText 时不会触发 UIControlEventEditingChanged的主要内容,如果未能解决你的问题,请参考以下文章

QLineEdit 不使用 setText 更新

使用 setText 时的内存泄漏

不要连接使用 setText 显示的文本。将资源字符串与占位符一起使用

如何在带参数的android的setText中使用html标签?

RecyclerView 不能在 onBindViewHolder() 中使用 setText()

在其他方法 Android 中使用 Textview.setText