Установите UITextField для записи максимум 11 чисел с помощью NSNumberFormatter.

я пытаюсь настроить UITextField так, чтобы он принимал только 11 номеров, я использую NSNumberFormatter, и он отлично работает с использованием чисел, но когда я пытаюсь установить максимальное имеющиеся номера не работают.

Даже назначение setMaximumFractionDigits, setMaximumIntegerDigits и setMaximumSignificantDigits не работает должным образом, или я что-то упустил? пожалуйста помоги.

вот мой код…

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

NSNumberFormatter *num = [[NSNumberFormatter alloc] init];

[num setNumberStyle:NSNumberFormatterDecimalStyle];
[num setUsesSignificantDigits:YES];
[num setMaximumFractionDigits:0];
[num setMaximumIntegerDigits:11];
[num setMaximumSignificantDigits:11];

NSString *aString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
//[NSString stringWithFormat:@"%@%@", textField.text, string];
NSNumber *number = [num numberFromString:aString];

if (number) {
    return YES;
else
    return NO;
}

ИЗМЕНИТЬ:

Я переупорядочил код, как сказал Ян, и внес изменения, которые сказал Инк, и все равно я могу писать только числа, но я могу написать более 11 чисел.

ИЗМЕНИТЬ 2

Спасибо Ян и Инк, теперь это работает, мне нужно было проверить, что aString.length меньше 12 и это число.

    if (aString.length < 12 && number)
        return YES;
    else
        return NO;

Спасибо за любую помощь!


person xzrudy    schedule 14.11.2014    source источник
comment
Приведите несколько примеров, если что-то не работает.   -  person rmaddy    schedule 14.11.2014
comment
Я действительно предлагаю не делать этого. Отклонение изменений пользовательского контента по мере его ввода на основе фильтрации довольно неприятно. Текст может проходить через ряд промежуточных стадий по мере того, как пользователь вводит его, и, проверяя, когда он вводит, вы требуете, чтобы он следовал по пути, который может быть для него неочевидным.   -  person Steven Fisher    schedule 14.11.2014


Ответы (2)


Вы назначаете number перед установкой ограничений на num... Попробуйте вместо этого:

[num setUsesSignificantDigits:YES];
[num setMaximumFractionDigits:0];
[num setMaximumIntegerDigits:11];
[num setMaximumSignificantDigits:11];

NSNumber *number = [num numberFromString:aString];

if (number) {
  return [[num stringFromNumber:number] length] <= 11 && [[num stringFromNumber:number] length] == [aString length];
} else {
  return NO;
}
person Ian MacDonald    schedule 14.11.2014
comment
Я попробовал это, и я все еще могу написать более 11 номеров. - person xzrudy; 14.11.2014
comment
Ну, это потому, что вы не проверяете длину вещи, вы просто используете ее результат. Он по-прежнему будет анализировать число, просто оно не обязательно будет соответствовать вашему вводу. Если вы беспокоитесь о результате, вы должны сравнить aString.length <= 11 или использовать свой форматировщик чисел, чтобы пойти в обратном порядке и проверить эту длину... - person Ian MacDonald; 14.11.2014
comment
Какой я тупой, я просто оценивал само число, мне нужно было проверить, имеет ли aString длину ‹ 12. теперь это работает !, спасибо, приятель, что помог мне понять это! - person xzrudy; 14.11.2014

aString должно быть [textField.text stringByReplacingCharactersInRange:range withString:string]

return aString.length <= 11;

Оттуда вы можете просто проверить длину строки, предполагая, что вы знаете, что это числовая строка. Если вы не можете этого предположить, сделайте то, что предложил @Ian MacDonald, и измените порядок кода, чтобы он выглядел следующим образом:

NSNumber *rawNumber = [num numberFromString:aString];

[num setUsesSignificantDigits:YES];
[num setMaximumFractionDigits:0];
[num setMaximumIntegerDigits:11];
[num setMaximumSignificantDigits:11];

NSNumber *number = [num numberFromString:aString];
return rawNumber == number;

Также обратите внимание, что недостаточно просто посмотреть, дал ли вам число форматировщик чисел. Вам нужно проверить и посмотреть, не обрезан ли номер форматтером.

person InkGolem    schedule 14.11.2014
comment
Хотя это правда, это не ответ на вопрос. Сделайте это комментарием или обновите свой ответ, чтобы на самом деле ответить на вопрос. - person rmaddy; 14.11.2014
comment
Я сделал то, что вы сказали мне, и я все еще получаю тот же результат; Я могу написать более 11 цифр. - person xzrudy; 14.11.2014
comment
@xzrudy добавил подробности - person InkGolem; 14.11.2014