微信、boss等应用,输入框只要有限制文本长度,都会出现奔溃。
UITextField
和UITextView
限制字符长度,输满输入框后,粘贴后再撤销奔溃。
复现步骤
0、粘贴板有粘贴的内容。
1、输入框文本输满。
2、该输入框键盘弹起。
3、三只手指选中同时点击键盘。
4、依次点击系统弹出的控件粘贴和撤销按钮。
解决办法:
/// 处理undo奔溃
class InputLimit: NSObject{
@objc static func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String, maxInputCnt: Int) -> Bool {
return textInput(textField, shouldChangeCharactersIn: range, replacementString: string, maxInputCnt: maxInputCnt)
}
@objc static func textView(_ textView: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String, maxInputCnt: Int) -> Bool {
return textInput(textView, shouldChangeCharactersIn: range, replacementString: string, maxInputCnt: maxInputCnt)
}
private static func textInput(_ textInput: UITextInput, shouldChangeCharactersIn range: NSRange, replacementString string: String, maxInputCnt: Int) -> Bool{
guard let textRange = textInput.textRange(from: textInput.beginningOfDocument, to: textInput.endOfDocument) else{return false}
let optionalText = textInput.text(in: textRange)
guard let text = optionalText else { return true }
let len = text.count + string.count - range.length
if len <= maxInputCnt {
if (string.isEmpty && range.length > 0 && text.count < range.location + range.length) {
/// 这里可以判断为删除或者为撤销,
/// text.count < range.location + range.length判断从中间删除
let fillText = text.count > range.length ? String(text.dropLast(range.length)) : ""
textInput.replace(textRange, withText: fillText)
return false
}
return true
}
return false
}
}
这里隐藏一个很深的bug,留言区留言我告诉你。