常规的两个入口输入框文字限制:

  • 通过监听TextField的UIControl.Event.editingChanged

  • 通过TextField的代理方法,textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool

这些方法在中文(预显示拼音)末尾细节处理上都有问题,这里不进行赘述。

办法是通过判断markedTextRange解决:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 监听 UIControl.Event.editingChanged 事件的action
@objc fileprivate func editingChangedAction(_ sender: UITextField) {
guard let text = sender.text else {
return
}
if sender.markedTextRange != nil {
// 如果是预排版的不判断字数
return
}
let textCount = text.count
let minCount = min(textCount, 100)
self.text = (text as NSString).substring(to: minCount)
}