繁体   English   中英

为什么rangeChangeCharactersInRange委托方法中的退格的range.length值会发生变化?

[英]Why range.length value changes for backspace in shouldChangeCharactersInRange delegate methos?

在我限制用户最多24个字符后,我试图找出这条适用于退格的行。 但我不知道它是如何运作的。

我试图弄清楚range.length的值,如果我插入一些字符,它会设置为0。 但是当我按下后退按钮同时删除字符时,我将值设置为1? 为什么是这样?

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    println("range is \(range)")
    println("range location is \(range.location)")
    println("range length is \(range.length)")    

    if (textlength - (range.length) + count(string)) > 24 {                  
       textField.layer.borderColor = UIColor.redColor().CGColor
       textField.layer.borderWidth = 1.0

       println("\(newString)")
       return false
    }        
    return true
}

尝试插入长3个字符的电子文本。 然后选择全部并点击剪切 你应该看到类似的东西:

range is (0,3)
range location is 0
range length is 3

插入时,由于未选择任何内容,因此获得长度为0。 你只需要光标位置。 删除range.length将是可以删除的字符串的长度。 当您回击时,您只需删除最后一个字符,因此range.length为1。

该方法显示shouldChangeCharacterInRange ,因此当您插入新字符时,不会替换或删除现有字符,因此它将长度设为0.而当您删除字符时,它将返回要删除的字符的范围,显然是1。

例如:

假设你有一个文本Hello World这个包含11个字符。

现在当你插入一个新角色 ,它将返回插入此新字符的最后一个字符后的范围,即{11,0}

现在当你删除一个字符时,让我们说最后一个字符,它将返回最后一个字符的范围,即{10,1}

您可以通过长按一些文本并删除它来测试它。 让我们说如果你长按“ 世界 ”并删除它。 这将返回长度为5的范围,即{5,5}


因此,您需要在附加更改后检查文本,即

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    let stringAfterAppendingChanges = textField.text.stringByReplacingCharactersInRange(range, withString: string)

    if (stringAfterAppendingChanges.length > 24 {                  
       textField.layer.borderColor = UIColor.redColor().CGColor
       textField.layer.borderWidth = 1.0

       println("\(stringAfterAppendingChanges)")
       return false
    }

    textField.layer.borderColor = UIColor.clearColor().CGColor        
    return true
}

执行此长度检查的最简单方法可能是实际应用替换,然后测试结果字符串。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let current = textField.text
    let modified = current.stringByReplacingCharactersInRange(range, withString: string)

    if (modified.length > 24 {                  
       textField.layer.borderColor = UIColor.redColor().CGColor
       textField.layer.borderWidth = 1.0

       println("\(modified)")
       return false
    }        
    return true
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM