自动更正文本时,UITextField 未调用 editorChanged 事件

Posted

技术标签:

【中文标题】自动更正文本时,UITextField 未调用 editorChanged 事件【英文标题】:UITextField not calling editingChanged event when text is autocorrected 【发布时间】:2017-07-19 21:56:26 【问题描述】:

我有一个返回键类型为Done 的 UITextField,并且我已将委托设置为在点击返回按钮时退出第一响应者状态。我还设置了editingChanged 操作,让我知道用户何时编辑文本。但它似乎没有在以下上下文中被调用。

假设用户在文本字段中输入了“Pizzs”。 editingChanged 动作被触发,它表示文本字段的值为“Pizzs”。同时,“Pizza”作为建议出现在键盘建议栏中。如果他们按空格键,则接受自动更正并调用editingChanged 事件,并带有新文本“Pizza”。但是如果他们点击Done,那么键盘就会被关闭,UITextField 中的文本会更改为“Pizza”,但永远不会调用editingChanged

这是一个错误,对吧?我应该向苹果报告吗?或者这是预期的行为,因为文本正在以编程方式而不是由用户更改?谁能想到一个好的解决方法?

【问题讨论】:

您好,请问您解决了这个问题吗?我有同样的问题:( 没有。我向 Apple 提交了 Radar,但我认为它从未得到解决。 【参考方案1】:

在这种情况下,您应该使用.allEditingEvents

textField.addTarget(self, action: #selector(didChangeText(_:)), for: .allEditingEvents)

【讨论】:

【参考方案2】:

我遇到了同样的问题,并通过实现 UITextFieldDelegate 方法 textFieldShouldReturn(_ textField: UITextField) -> Bool 来解决它,并在那里执行我在 editorChanged 事件处理程序中执行的相同操作。

所以,我基本上是这样做的:

textField.addTarget(self, action: #selector(textFieldEditingChanged(_:)), for: .editingChanged)

func textFieldShouldReturn(_ textField: UITextField) -> Bool 
    textField.resignFirstResponder()
    processText()
    return false


@objc func textFieldEditingChanged(_ textField: UITextField) 
    processText()


func processText() 
    // Process text here

【讨论】:

这仅适用于用户点击返回以完成自动更正的情况。但是点击屏幕(不取消自动更正弹出窗口)也会触发自动更正替换但不会调用textFieldShouldReturn

以上是关于自动更正文本时,UITextField 未调用 editorChanged 事件的主要内容,如果未能解决你的问题,请参考以下文章

禁用 UITextField 的自动更正

UITextField在开始编辑时具有“清除”按钮大小

编辑时如何更改 UITextField

在 Espresso 测试中禁用自动更正功能

是否可以删除 iOS Quicktype 键盘但保持自动更正?

text 键入文本框时如何关闭自动更正?