undo奔溃的问题

微信、boss等应用,输入框只要有限制文本长度,都会出现奔溃。

UITextFieldUITextView限制字符长度,输满输入框后,粘贴后再撤销奔溃。

复现步骤
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,留言区留言我告诉你。

你可能感兴趣的:(undo奔溃的问题)