Как проверить ввод текстового поля в режиме реального времени?

Я пишу проверку для своего текстового поля, я обнаружил кое-что интересное: могу ли я проверить, сколько цифр я набираю в текстовом поле в режиме реального времени. Мое поле ввода должно быть 8-значным. Поэтому я хочу изменить текст внутри текстового поля на зеленый, когда я наберу 8 цифр, и изменить цвет, если это не так.

Как я могу это сделать? Пожалуйста, помогите мне, спасибо заранее.

6 ответов

Решение

С помощью -textField:shouldChangeCharactersInRange:replacementString: вероятно, плохое решение, потому что оно срабатывает до обновления текстового поля. Этот метод, вероятно, следует использовать, если вы хотите изменить текст текстового поля до того, как клавиатура автоматически его обновит. Здесь вы, вероятно, захотите просто использовать сопряжение целевого действия при редактировании изменений значения:

[textField addTarget:self action:@selector(checkTextField:) forControlEvents:UIControlEventEditingChanged];

Затем в - (void)checkTextField:(id)sender, попробуй это:

UITextField *textField = (UITextField *)sender;
if ([textField.text length] == 8) {
    textField.textColor = [UIColor greenColor]; // No cargo-culting please, this color is very ugly...
} else {
    textField.textColor = [UIColor blackColor];
    /* Must be done in case the user deletes a key after adding 8 digits,
       or adds a ninth digit */
}
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];

//    [textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]];
    NSLog(@"%@",searchStr);
    return YES;
}

Используйте UITextFieldDelegate. особенно эта функция

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

и вы можете получить образцы кодов ссылки здесь..

[textField addTarget:self action:@selector(checkTextField) forControlEvents:UIControlEventEditingChanged];

Попытайся!

Установить делегата для UITextField и реализовать метод – textField:shouldChangeCharactersInRange:replacementString: Подробности и примеры в Справочнике по протоколу UITextFieldDelegate, но вот быстрый пример:

- (BOOL)textField:(UITextField *)textField 
shouldChangeCharactersInRange:(NSRange)range 
replacementString:(NSString *)string
{
        NSString *text = [textField text];
        // NOT BACKSPACE
        if ([string length] || text.length + string.length < 8) {
            return YES;
        } else if (text.length + string.length > 8) {
            return NO;
        } else {
                // DO SOMETHING FOR LENGTH == 8
                return YES;
        }
}   

Обновление Swift 4.0

 txtFieldAdd.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)

Теперь вызовите вашу функцию. В моем случае это активирует кнопку сохранения

@objc func textFieldDidChange(_ textField: UITextField) {
    if (txtFieldAdd.text?.isEmpty)! {
        btnSave.isEnabled = false
    }
    else {
        btnSave.isEnabled = true
    }
}

Надеюсь, поможет.

Вот как вы получаете проверку в реальном времени, не устанавливая ничего, кроме делегата текстового поля:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    // Creating the future string. The incoming string can be a single character,
    // empty (on delete) or many characters when the user is pasting text.

    let futureString: String = ((textField.text ?? "") as NSString).replacingCharacters(in: range, with: string)

    // Determine if the change is allowed, update form, etc.
    let allowChange = <#Your Validation Code#>

    return allowChange
}

Добавьте этот код к назначенному делегату текстового поля. Просто.

Другие вопросы по тегам