使用 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的主要内容,如果未能解决你的问题,请参考以下文章
不要连接使用 setText 显示的文本。将资源字符串与占位符一起使用
如何在带参数的android的setText中使用html标签?