2010-03-26 5 views

ответ

230

Это корректно работает с забой и скопировать & пасты:

#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. Спасибо, мистер Роджерс!

+13

Этот ответ замечательный. Лучше, чем принятый. –

+1

Этот ответ является единственным, который действительно работает, когда пользователь пытается вставить длинную строку. Пожалуйста, поддержите! – JosephH

+0

+1 для очень четко написанного кода. – PEZ

39

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; 
} 

ORIGINAL

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

  1. Реализация UITextFieldDelegate протокола
  2. Реализация метода 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; 
} 
+1

Да, я имел в виду UITextField, я редактировал свой вопрос. Я понял. Спасибо за Ваш ответ. Меня устраивает ! – Elegya

+1

Вам также нужно назначить надлежащего делегата для UITextField. – Ecarrion

+11

Это несколько ошибочно: 1) путем проверки существующей длины текста поля (а не предлагаемой новой длины) вы разрешаете пользователю перейти на 1 символ за пределы максимума и 2) он не мешает пользователям копировать и вставлять больше текста в. –

1

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

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

- (NSString *)substringToIndex:(NSUInteger)anIndex 
+1

К сожалению, вопросник изменил свой вопрос после того, как вы ответили, поэтому ваш ответ больше не имеет смысла :( – JosephH

16

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

#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; 
    } 

Cheers!

+2

Я считаю, что вам не нужно подстроить текстовое поле – Ecarrion

+0

, это работает для меня намного лучше :) спасибо – Peter

+4

Это не мешает длина превышает максимальное значение, когда пользователь вставляет строку, которая больше максимальной. – JosephH

4

Я думаю, что этот код будет делать трюк:

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

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

+0

Это не полностью охватывает случай, когда пользователь вставляет; это позволяет чересчур длине. – JosephH

1

Это похоже на ответ 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; 
} 
+0

Это не предотвращает превышение длины, когда пользователь вставляет строку длиной более 1. – Shebuka

2

Для меня это было волшебство:

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

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

TextFieldname.delegate=self 
+2

Это не полный ответ. Реализация делегата была бы более интересной. –

1

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

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

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

- (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

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

- (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; 
} 
Смежные вопросы