textField:shouldChangeCharactersInRange:replacementString:在QuickType预测中触发编辑更改行为

时间:2018-07-13 08:28:05

标签: ios swift delegates uitextfield

我已经实现了 textField:shouldChangeCharactersInRange:replacementString:用于处理UITextField的文本长度

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
     .... 
    return validCount <= maxSize 
}

此外,我已经为所有编辑事件实现了 UITextField 目标操作

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

和textFieldDidChanged

  @objc func textFieldDidChanged(_ textField: UITextField) { 
   .....
  }

理想情况下,一旦 textField:shouldChangeCharactersInRange:replacementString:返回true,它将触发编辑事件并触发 textFieldDidChanged ,并且在大多数情况下都会这样做。

但是,如果我有输入来自快速类型预测输入。 textField:shouldChangeCharactersInRange:replacementString:将被调用两次:

  1. 第一个电话是将预测推荐工作作为输入
  2. 第二个只是输入的空白​​“”

您需要步骤2返回true来触发 textFieldDidChanged

因此,当单词长度与长度限制匹配时,我会遇到麻烦,在这种情况下,步骤1将返回true,因为它的长度等于限制,但是步骤2将返回false,因为它超出了限制。在这种情况下,它不会触发 textFieldDidChanged 。但是由于第1步返回true,所以单词将在textField上移动,因此我实际上需要在第1步返回true之后触发 textFieldDidChanged

我知道我可以在 textField:shouldChangeCharactersInRange:replacementString:中找到一些解决方法来解决此问题。但是我想确定的是,在使用快速类型预测输入时,第1步单词实际上发生了更改,而仅根据第2步返回了 textFieldDidChanged 的预期行为?

0 个答案:

没有答案