键盘的撤销按键是iPad独有的一个按键,在手机端是不存在这个按键的,但是手机端同样也存在撤销操作,只不过并不是通过键盘上的按键来进行撤销操作的。
问题
当对TextView
或者是TextField
添加了限制输入长度。然后在控件中输入到最长长度,这时候继续去输入东西,但是从界面上来看我们输入的东西是没有显示出来的。此时按一下键盘上的撤销按键
此时就会出现数组越界的崩溃问题。
当出现数组越界这个问题的时候其实我们很容易就能想到原因是什么的。就是虽然我们限制了输入的长度,但实际上在存储撤销信息的数组中仍然还在继续的输入东西。但是实际上控件中却并没有相应的信息(或者说是长度与数组的长度不符)。这个问题最容易出现在
TextField
,因为原生的控件中并没有实现实时的输入信息,所以通常我们会添加一个监听来实现很少去调用TextFieldDelegate
。所以这个问题也就很容易忽略掉了。
解决方案
TextView
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
let existedLength = textView.text?.count ?? 0
let selectedLength = range.length
let replaceLength = text.count
let pointLength = existedLength - selectedLength + replaceLength
if pointLength > 最大长度{
return false
}
return true
}
TextField
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let existedLength = textField.text?.count ?? 0
let selectedLength = range.length
let replaceLength = string.count
let pointLength = existedLength - selectedLength + replaceLength
if pointLength > 最大长度 {
return false
}
return true
}
具体的内部细节问题还是要大家共同去探索学习,这里只提供了一下解决方案
一点点延伸
当我们在输入键盘自带的表情的时候一定是要去注意一下的。因为他的长度是2
,我们正常输入数字、字母、汉字等等可以看做是1
,所以如果输入框里面带有表情一定要注意判断长度。
网友评论