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