shouldChangeCharactersInRange Range.length始终为0

时间:2016-11-09 20:58:25

标签: ios swift user-interface uitextfield uitextfielddelegate

问题:由于某些原因,在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免受杀害   这个。您只需要确保它建议更换的范围   确实存在于其当前字符串中。这是最初的理智   检查以上确实。

非常感谢任何帮助:)

0 个答案:

没有答案