Можно ли установить максимальную длину на UITextField?Установить максимальную длину UITextField
Что-то вроде атрибута MAXLENGTH в полях ввода HTML.
Можно ли установить максимальную длину на UITextField?Установить максимальную длину UITextField
Что-то вроде атрибута MAXLENGTH в полях ввода HTML.
Это корректно работает с забой и скопировать & пасты:
#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. Спасибо, мистер Роджерс!
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. Если да, то есть простой способ.
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;
}
Да, я имел в виду UITextField, я редактировал свой вопрос. Я понял. Спасибо за Ваш ответ. Меня устраивает ! – Elegya
Вам также нужно назначить надлежащего делегата для UITextField. – Ecarrion
Это несколько ошибочно: 1) путем проверки существующей длины текста поля (а не предлагаемой новой длины) вы разрешаете пользователю перейти на 1 символ за пределы максимума и 2) он не мешает пользователям копировать и вставлять больше текста в. –
Я думаю, что такого имущества нет.
Но текст, назначенный UILabel, должен быть NSString. И прежде чем назначить эту строку текст имущество UILabel в вы можете, например, использовать следующий метод NSString, чтобы обрезать строку по данному индексу (ваш MAXLENGTH):
- (NSString *)substringToIndex:(NSUInteger)anIndex
К сожалению, вопросник изменил свой вопрос после того, как вы ответили, поэтому ваш ответ больше не имеет смысла :( – JosephH
А лучше функция, которая обрабатывает забой правильно и ограничение символы на прилагаемый предел длины следующие:
#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!
Я думаю, что этот код будет делать трюк:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString*)string
{
if (range.location >= MAX_LENGTH)
return NO;
return YES;
}
С помощью этого метода делегата вы можете запретить пользователю добавлять больше символов, чем MAX_LENGTH в текстовое поле, и пользователь должен иметь возможность вводить забоя при необходимости ,
Это не полностью охватывает случай, когда пользователь вставляет; это позволяет чересчур длине. – JosephH
Это похоже на ответ 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;
}
Это не предотвращает превышение длины, когда пользователь вставляет строку длиной более 1. – Shebuka
Для меня это было волшебство:
if (textField.text.length >= 10 && range.length == 0)
return NO;
return YES;
Вам нужно назначить делегата ViewDidLoad
TextFieldname.delegate=self
Это не полный ответ. Реализация делегата была бы более интересной. –
это, как я решить эту проблему. Когда максимальный предел достигнут он не будет пытаться добавить больше ... Вы только будете в состоянии удалить символы
(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if ([textfield.text length] > MAX_SIZE && ![string isEqualToString:@""]) {
return NO;
}
}
Вы должны быть осведомлены о месте текст помещается в так же как длина текста, в котором (если они вставляют более одного символа). Шаблон между ними по отношению к максимальной длине состоит в том, что их сумма никогда не должна превышать максимальную длину.
- (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;
}
Этот код ограничивает текст, а также позволяет вводить символы или вставлять их в любом месте. Если результирующий текст будет слишком длинным, он изменит символы в диапазоне и укорачивает полученный текст до предела.
- (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;
}
Этот ответ замечательный. Лучше, чем принятый. –
Этот ответ является единственным, который действительно работает, когда пользователь пытается вставить длинную строку. Пожалуйста, поддержите! – JosephH
+1 для очень четко написанного кода. – PEZ