当 TextField 成为第一响应者时,`controlTextDidEndEditing` 会被触发

Posted

技术标签:

【中文标题】当 TextField 成为第一响应者时,`controlTextDidEndEditing` 会被触发【英文标题】:`controlTextDidEndEditing` gets fired when TextField becomes first responder 【发布时间】:2013-02-22 09:07:29 【问题描述】:

我试图通过实现NSTextFieldDelegatecontrolTextDidEndEditing: 方法来检测用户何时完成编辑NSTextField。然而问题是,在最初使NSTextField 成为窗口的第一响应者时,controlTextDidEndEditing: 通知立即被触发。我在一个非常简单的测试应用程序中尝试了这个并确认了结果。非常感谢一些关于为什么会这样以及如何检测 textField 何时失去焦点的指示。

【问题讨论】:

【参考方案1】:

由于 text field 是 first Responder,selectText: 消息也会发送到 textField,这将导致它结束编辑。如果您不希望这种行为设置 NO 为 textField 的可选属性。

- (void)selectText:(id)sender;

结束编辑并选择接收器的全部内容(如果可选择)。

【讨论】:

如果希望实际保持文本字段可选择怎么办?此外,testField 最初也不是第一响应者。它成为第一响应者,并在成为第一响应者时发送controlTextDidEndEditing 通知。真是令人费解 当它进入 firstResponder 状态时,它被要求选择它的文本,所以 selectText: message 将结束编辑。 有没有办法阻止selectText: 消息的发送?或者直接selectText:而不成为第一响应者? 在文本字段上使用 setSelectable:NO。 您可以在做出第一响应者之前使用setSelectable:NO,然后再将其改回“是”吗?因为文本字段实际上应该是可选择的。

以上是关于当 TextField 成为第一响应者时,`controlTextDidEndEditing` 会被触发的主要内容,如果未能解决你的问题,请参考以下文章

iOS:UIAlertController 上的 textField 成为当前警报时的第一响应者

TextField 中的 IOS8 文本在焦点上反弹

ObjC iOS11:在 inputAccessoryView 中成为第一响应者时,TextField 不显示

将新 UITableView 单元格的 textField 设为 firstResponder

Mac - 让文本框成为第一响应者

带有 TextField 和第一响应者的自定义 UITableViewCell