Ограничить отображение UITextField при вводе пользователем текста на основе введенных символов

#ios #objective-c #uitextfield

#iOS #objective-c #uitextfield

Вопрос:

Мне было интересно, возможно ли ограничить то, что UITextField отображается на основе символов, введенных пользователем при вводе. Например, я хотел бы исключить символ «!» из отображения в UITextField , чтобы, когда пользователь вводит «Nice!», то, что он видит в текстовом поле, было просто «Nice», с мигалкой рядом с «e».

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

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    [self updateTextLabelsWithText: newString.lowercaseString];

    return YES;
}
  

Комментарии:

1. К вашему сведению — пожалуйста, прекратите использовать тег iPhone для всех ваших вопросов. Это почти никогда не применяется.

2. Готово — я также удалю их из предыдущих вопросов.

3. Какая проблема у вас возникла с опубликованным вами кодом?

4. Примененный код (который изменяет все на строчную строку), похоже, не работает для того, какой текст отображается в UITextField . Я могу ввести «HELLO», и оно все равно останется как «HELLO», а не как «привет», как предполагалось.

5. Вам нужно будет показать нам updateTextLabelsWithText: метод.

Ответ №1:

Обновленный ответ

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

 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    BOOL shouldReplace = YES;

    NSRange invalidCharRange = [string rangeOfString:@"!"];

    if(invalidCharRange.length > 0)
    {
        shouldReplace = NO;

        NSString *cleanedString = [string stringByReplacingOccurrencesOfString:@"!" withString:@""];

        NSString *completeString = [[NSString alloc] initWithFormat:@"%@%@", textField.text, cleanedString];

        textField.text = completeString;
    }
    else
    {
        textField.text = [textField.text stringByReplacingOccurrencesOfString:@"!" withString:@""];
    }

    if([string isEqualToString:@"!"])
    {
        shouldReplace = NO;
    }

    return shouldReplace;
}
  

Оригинальный ответ

Просто установите NO, если заменяющая строка «!»:

 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    BOOL shouldReplace = YES;

    if([string isEqualToString:@"!"])
    {
        shouldReplace = NO;
    }

    return shouldReplace;
}
  

Комментарии:

1. Лучше всего ограничить ваш код только соответствующей частью. Методы viewDidLoad и didReceiveMemoryWarning в ответе не нужны.

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

3. Это помогло — спасибо! Отличная мысль о вставке @rmaddy, это тот UITextField случай, когда вставка маловероятна, но я настрою некоторые меры предосторожности.

4. Я также обновил ответ обработкой вставляемых слов, содержащих недопустимые символы, посмотрите, работает ли это для вас @daspianist. Хотя, если ваши требования изменятся, например, вы хотите фильтровать @ characters в дополнение к ! символы, тогда вам, вероятно, понадобится более надежная функция проверки, которая рекурсивно проверяет каждый недопустимый символ и рекурсивно заменяет их в строке перед ее возвратом.

5. Потрясающе — теперь это отлично работает даже для вставленных строк. Большое спасибо @Zhang!

Ответ №2:

Как насчет этого?

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *previousString_ = textField.text;
    NSString *upperCased_ = [string uppercaseString];
    previousString_ = [previousString_ stringByReplacingCharactersInRange:range withString:upperCased_];
    [textField setText:previousString_];

    return NO;
}
  

Этот код изменит нижнюю строку ввода на заглавную

Комментарии:

1. Спасибо — это было очень полезно, указав мне правильное направление.