Я пытаюсь понять эту строку, которая очень хорошо работает для backspace после того, как я ограничу пользователя до 24 символов. Но я не знаю, как это работает.Зачем изменять значение range.length для backspace в ifChangeCharactersInRange delegate methos?
Я попытался вычислить значение 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
}
Кстати, из вашего кода не ясно, где '' textlength' и newString' пришли. В любом случае надеюсь, что мой намек поможет. –
umm..thanks действительно умное тестирование .... еще один вопрос ... let modified = current.stringByReplacingCharactersInRange (range, withString: string) .. Если да, то как эта линия работает ... перед заменой charactes он выбирает всю длину, а затем добавляет новую строку ...или это значение диапазона, установленное равным 0 во время этого утверждения, тоже –
, возможно, вы ссылаетесь на пример @DarkDust. В любом случае «диапазон», передаваемый 'shouldChange ...', является положением и длиной того, что _shouldChange_. Остерегайтесь не путать его с длиной замены. В качестве другого примера вы можете попробовать выбрать 3 символа, а затем нажать букву (вместо спины). На этот раз пройденный диапазон будет иметь длину 3 (поскольку 3 символа будут заменены), а строка замены будет единственным символом. 'modified ...' заменит выбранные 3 символа (в' range' from 'current') единственным символом' replacementString' –