Хотя класс UITextField
не имеет свойства максимальной длины, эту функцию относительно просто получить, установив delegate
в текстовом поле и реализовав следующий метод делегата:
Objective-C
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// Prevent crashing undo bug – see note below.
if(range.length + range.location > textField.text.length)
{
return NO;
}
NSUInteger newLength = [textField.text length] + [string length] - range.length;
return newLength <= 25;
}
Swift
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let currentCharacterCount = textField.text?.count ?? 0
if range.length + range.location > currentCharacterCount {
return false
}
let newLength = currentCharacterCount + string.count - range.length
return newLength <= 25
}
Перед изменением текстового поля UITextField спрашивает делегата, следует ли изменить указанный текст . На этом этапе текстовое поле не изменилось, поэтому мы берем его текущую длину и длину вставляемой строки (либо путем вставки скопированного текста, либо путем ввода одного символа с клавиатуры), за вычетом длины диапазона. Если это значение слишком длинное (более 25 символов в этом примере), верните NO
, чтобы запретить изменение.
При вводе одного символа в конце текстового поля range.location
будет длиной текущего поля, а range.length
будет 0, потому что мы ничего не заменяем / не удаляем. Вставка в середину текстового поля означает просто другой range.location
, а вставка нескольких символов означает, что string
содержит более одного символа.
Удаление отдельных символов или вырезание нескольких символов задается range
с ненулевой длиной и пустой строкой. Замена - это просто удаление диапазона с непустой строкой.
Замечание об ошибке "отменить"
Как уже упоминалось в комментариях, есть ошибка с UITextField
, которая может привести к сбою.
Если вы вставляете в поле, но ваша реализация проверки не поддерживает вставку, операция вставки все еще записывается в буфер отмены приложения. Если вы затем отмените отмену (встряхивая устройство и подтвердив отмену), UITextField
попытается заменить строку, которую считает , вставленной в себя пустой строкой. Это приведет к сбою, потому что он на самом деле не вставил строку в себя. Он попытается заменить часть строки, которая не существует.
К счастью, вы можете защитить UITextField
от такого убийства. Вам просто нужно убедиться, что диапазон, который он предлагает заменить , существует в его текущей строке. Это то, что делает начальная проверка здравомыслия выше.
swift 3.0 с копией и вставкой работает нормально.
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
let str = (textView.text + text)
if str.characters.count <= 10 {
return true
}
textView.text = str.substring(to: str.index(str.startIndex, offsetBy: 10))
return false
}
Надеюсь, это полезно для вас.