Установить максимальную длину UITextField

Можно ли установить максимальную длину на UITextField?

Что-то вроде атрибута MAXLENGTH в полях ввода HTML.

Ответ 1

Это корректно работает с backspace и копирует и вставляет:

#define MAXLENGTH 10

- (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSUInteger oldLength = [textField.text length];
    NSUInteger replacementLength = [string length];
    NSUInteger rangeLength = range.length;

    NSUInteger newLength = oldLength - rangeLength + replacementLength;

    BOOL returnKey = [string rangeOfString: @"\n"].location != NSNotFound;

    return newLength <= MAXLENGTH || returnKey;
}

UPDATE: Обновлено, чтобы принять ключ возврата, даже когда он находится в MAXLENGTH. Спасибо, мистер Роджерс!

Ответ 2

UPDATE

Я не могу удалить этот ответ, потому что он принят, но это было неправильно. Вот правильный код, скопированный с TomA ниже:

#define MAXLENGTH 10

- (BOOL)textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSUInteger oldLength = [textField.text length];
    NSUInteger replacementLength = [string length];
    NSUInteger rangeLength = range.length;

    NSUInteger newLength = oldLength - rangeLength + replacementLength;

    BOOL returnKey = [string rangeOfString: @"\n"].location != NSNotFound;

    return newLength <= MAXLENGTH || returnKey;
}

ОРИГИНАЛ

Я думаю, вы имеете в виду UITextField. Если да, то есть простой способ.

  • Внедрить протокол UITextFieldDelegate
  • Внедрить метод textField:shouldChangeCharactersInRange:replacementString:.

Этот метод вызывается при каждом нажатии клавиши или предыдущей замене символа. в этом методе вы можете сделать что-то вроде этого:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if ([textField.text length] > MAXLENGTH) {
        textField.text = [textField.text substringToIndex:MAXLENGTH-1];
        return NO;
    }
    return YES;
}

Ответ 3

Лучшая функция, которая правильно обрабатывает обратные пространства и ограничивает символы до заданного предела длины, следующая:

#define MAXLENGTH 8

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
    {
        int length = [textField.text length] ;
        if (length >= MAXLENGTH && ![string isEqualToString:@""]) {
            textField.text = [textField.text substringToIndex:MAXLENGTH];
            return NO;
        }
        return YES;
    }

Ура!

Ответ 4

Этот код ограничивает текст, а также позволяет вводить символы или вставлять их в текст. Если результирующий текст будет слишком длинным, он изменит символы в диапазоне и укорачивает полученный текст до предела.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSUInteger newLength = [textField.text length] - range.length + [string length];
    if (newLength >= MAXLENGTH) {
        textField.text = [[textField.text stringByReplacingCharactersInRange:range withString:string] substringToIndex:MAXLENGTH];
        return NO;
    }
    return YES;
}

Ответ 5

Я думаю, что этот код выполнит трюк:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range 
                                                       replacementString:(NSString*)string
{
   if (range.location >= MAX_LENGTH)
      return NO;
    return YES;
}

С помощью этого метода делегата вы можете запретить пользователю добавлять в текстовое поле больше символов, чем MAX_LENGTH, и при необходимости пользователю следует вводить обратные пространства.

Ответ 6

Для меня это сделало магию:

if (textField.text.length >= 10 && range.length == 0)
    return NO;
return YES;

Ответ 7

Я думаю, что нет такого свойства.

Но текст, который вы назначаете UILabel, должен быть NSString. И прежде чем назначить эту строку текстовому свойству UILabel, вы можете, например, использовать следующий метод NSString для обрезки строки с заданным индексом (ваша максимальная длина):

- (NSString *)substringToIndex:(NSUInteger)anIndex

Ответ 8

Это похоже на ответ coneybeare, но теперь текстовое поле может содержать максимум символов MAXLENGTH:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if ([textField.text length] > MAXLENGTH - 1) {
        textField.text = [textField.text substringToIndex:MAXLENGTH];
        return NO;
    }
    return YES;
}

Ответ 9

вот как я решил эту проблему. Когда достигнут максимальный предел, он не попытается добавить больше... вы сможете удалить только символы

(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if ([textfield.text length] > MAX_SIZE && ![string isEqualToString:@""]) {
    return NO;
}
}

Ответ 10

Вы должны знать местоположение, в котором находится текст, а также длину добавляемого текста (если они вставляют более одного символа). Шаблон между ними по отношению к максимальной длине состоит в том, что их сумма никогда не должна превышать максимальную длину.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSInteger locationAndStringLengthSum = range.location + [string length];

    if ([textField isEqual:_expirationMonthField]) {
        if (locationAndStringLengthSum > EXP_MONTH_FIELD_MAX_CHAR_LENGTH) {
            return NO;
        }
    }
    else if ([textField isEqual:_expirationYearField]) {
        if (locationAndStringLengthSum > EXP_YEAR_FIELD_MAX_CHAR_LENGTH) {
            return NO;
        }
    }
    else if ([textField isEqual:_securityCodeField]) {
        if (locationAndStringLengthSum > SECURITY_FIELD_MAX_CHAR_LENGTH) {
            return NO;
        }
    }
    else if ([textField isEqual:_zipCodeField]) {
        if (locationAndStringLengthSum > ZIP_CODE_MAX_CHAR_LENGTH) {
            return NO;
        }
    }

    return YES;
}

Ответ 11

Вам нужно назначить делегата на ViewDidLoad

TextFieldname.delegate=self