问题:由于某些原因,在TextField Delegate方法中,shouldChangeCharactersInRange的range.length始终为0 ...
我的代码
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
var shouldChange = true
let newSubjectString = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string)
let newCharacters = NSCharacterSet(charactersInString: newSubjectString as String)
let currentCharacterCount = textField.text?.utf16.count ?? 0
if (range.length + range.location > currentCharacterCount){
return false
}
if newSubjectString.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) >= 3 {
return false
}
return true
}
我正试图摆脱" Undo Bug" (当粘贴没有通过我的验证然后我尝试摇动,撤消,然后应用程序崩溃)..虽然每当我检查此函数中的range.length ..它总是0.虽然同样的修复在我的应用程序的其他方面工作。
澄清......这不是我要修复的崩溃...崩溃的修复程序应该是以下几行(在我的应用程序的其他位置工作):
let currentCharacterCount = textField.text?.utf16.count ?? 0
if (range.length + range.location > currentCharacterCount){
return false
}
我遇到的问题是在使用^健全性检查时在特定控制器中..它并不总是准确的,因为在此委托方法中range.length始终为0。
A note on the crashing "undo" bug
正如评论中所提到的,UITextField存在一个错误 会导致崩溃。
如果您粘贴到该字段,但您的粘贴已被阻止 验证实现,粘贴操作仍记录在 应用程序的撤消缓冲区。如果你然后触发撤消(通过摇动 设备和确认撤消),UITextField将尝试 用空格替换它认为粘贴的字符串 串。这会崩溃,因为它从未实际粘贴过该字符串 对自己。它将尝试替换不具有的字符串的一部分 存在。
幸运的是,你可以保护UITextField免受杀害 这个。您只需要确保它建议更换的范围 确实存在于其当前字符串中。这是最初的理智 检查以上确实。
非常感谢任何帮助:)