Ios shouldChangeCharactersRange.length始终为0

Ios shouldChangeCharactersRange.length始终为0,ios,swift,user-interface,uitextfield,uitextfielddelegate,Ios,Swift,User Interface,Uitextfield,Uitextfielddelegate,问题:由于某些原因,在TextField中,委托方法应更改range中的字符range.length始终为0 我的代码 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { var shouldChange = true let newSubjectStri

问题:由于某些原因,在TextField中,委托方法应更改range中的字符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
}
我正试图摆脱“撤销Bug”(当粘贴未通过我的验证时,我尝试抖动、撤销,然后应用程序崩溃)。。但每当我检查此函数中的range.length时。。它总是0。虽然同样的修复在我的应用程序的其他领域也起了作用

为了澄清。。。这不是一个崩溃,我正在寻找修复。。。崩溃的修复应该是以下几行(在我的应用程序的其他地方也适用):

我遇到的问题是,在使用^sanity check时,在特定控制器中。。它并不总是准确的,因为在此委托方法中range.length始终为0

正如评论中提到的,UITextField有一个bug 可能导致撞车

如果您粘贴到字段中,但您的 验证执行时,粘贴操作仍记录在 应用程序的撤消缓冲区。如果您随后启动撤销(通过摇动 设备启动并确认撤消),UITextField将尝试 将它认为粘贴到自身的字符串替换为空字符串 一串这将崩溃,因为它从未实际粘贴字符串 自言自语。它将尝试替换字符串中不可用的部分 存在

幸运的是,您可以保护UITextField,使其不会像 这您只需要确保它建议替换的范围 不存在于其当前字符串中。这就是最初的理智 检查上面的内容


非常感谢您的帮助:)

如果您长按并按键盘上的任意字母选择某些文本,则其长度将不同于0。您需要提供有关崩溃的更多详细信息。到底是哪一条线导致了撞车?这次撞车的错误是什么?我担心的不是撞车。。因为以下几行通常会处理它:
let currentCharacterCount=textField.text?.utf16.count??0如果(range.length+range.location>currentCharacterCount){return false}
我更关心的是,为什么range.length总是0,而不管我键入什么文本,如果您确实想知道我添加的崩溃,那么检查它的方法是:
***由于未捕获的异常而终止应用程序'NSRangeException',原因:'-[\uu NSCFString ReplaceCharactersRange:withString:]:范围或索引超出范围“
它似乎来自
let newSubjectString=(textField.text!as NSString)。StringByReplacingCharactersRange(范围,withString:string)
同样,这可能与范围长度为0有关。我建议您在
let currentCharacterCount = textField.text?.utf16.count ?? 0
if (range.length + range.location > currentCharacterCount){
    return false
}