在我限制用户最多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
}
答案 0 :(得分:4)
尝试插入长3个字符的电子文字。然后选择全部并点击 cut 。 你应该看到类似的东西:
range is (0,3)
range location is 0
range length is 3
插入时,由于未选择任何内容,因此长度为0。你只有光标的位置。删除range.length将是可以删除的字符串的长度。 当您回击时,您只需删除最后一个字符,因此range.length为1。
答案 1 :(得分:2)
该方法显示 shouldChangeCharacterInRange ,因此当您插入新字符时,不会替换或删除现有字符,因此它将长度设为0.而当您删除字符时,它将返回要删除的字符范围,显然是1。
<强>实施例强>
假设你有一个文字 Hello World 这包含11个字符。
现在,当您插入一个新字符!时,它会返回插入此新字符的最后一个字符后的范围,即{11,0}
。
现在当你删除一个字符时,让我们说最后一个字符,它会返回最后一个字符的范围,即{10,1}
。
您可以通过长按某些文本并将其删除来测试。让我们说如果你长按&#34; 世界&#34;并删除它。这将返回长度为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
}
答案 2 :(得分:1)
进行此长度检查的最简单方法可能是实际应用替换,然后测试结果字符串。
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
}