我已经实现了 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:将被调用两次:
您需要步骤2返回true来触发 textFieldDidChanged
因此,当单词长度与长度限制匹配时,我会遇到麻烦,在这种情况下,步骤1将返回true,因为它的长度等于限制,但是步骤2将返回false,因为它超出了限制。在这种情况下,它不会触发 textFieldDidChanged 。但是由于第1步返回true,所以单词将在textField上移动,因此我实际上需要在第1步返回true之后触发 textFieldDidChanged 。
我知道我可以在 textField:shouldChangeCharactersInRange:replacementString:中找到一些解决方法来解决此问题。但是我想确定的是,在使用快速类型预测输入时,第1步单词实际上发生了更改,而仅根据第2步返回了 textFieldDidChanged 的预期行为?