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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容