Как я могу получить метод textDidChange (например, для UISearchBar) для UITextField?

Как я могу получить метод textDidChange для UITextField? Мне нужно вызвать метод каждый раз, когда в текстовое поле внесено изменение. Это возможно? Спасибо!

Ответы

Ответ 1

Вы можете настроить делегат и использовать

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

Ответ 2

Вы можете использовать UITextFieldTextDidChangeNotification для вызова метода всякий раз, когда изменяется текстовое поле. Добавьте это в свой init:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextFieldTextDidChangeNotification object:nil];

Ответ 3

Вы также можете выбрать цель и селектор для события UIControlEventEditingChanged. Например:

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

Обратите внимание, что это будет вызвано только для внесенных пользователем изменений в текстовое поле и не будет вызываться автоматически при программном настройке текста.

Ответ 4

Разрабатывая далее на Бена Готлиба, ответьте выше, используя textField shouldChangeCharactersInRange отлично, но имеет тот недостаток, что некоторые вещи могут произойти с задержкой одного символа.

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

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

    if (!textField.text.length) {
        // Do something with empty textfield
    }
    return YES;
 }

Этот метод позволяет вам получить рудиментарное изменение, происходящее в вашем текстовом поле. Хотя это не так прямо, как NSNotification, он по-прежнему позволяет использовать аналогичные методы с различными текстовыми полями, поэтому очень полезно использовать при попытке получить определенные изменения символов в текстовом поле.

В приведенном ниже коде фиксируется задержка символа

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

    // This means it updates the name immediately
    NSString * newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    textField.placeholder = newString.length ? @"" : @"Name";

    return YES;
 } 

Этот код используется для добавления замещающего объекта в UITextField, когда в текстовом поле не отображается текст

Ответ 5

Я нашел некоторые проблемы, когда вы используете replaceCharactersInRange в делегате shouldChangeCharactersInRange.

Пример: во вьетнамской клавиатуре строка aaâ, поэтому, если вы используете метод replaceCharactersInRange то replaceCharactersInRange неверные результаты.

Вы можете попробовать в этом случае событие UIControlEventEditingChanged:

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

Ответ 6

Быстрое решение

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)
    return true
}

Ответ 7

Ниже я использовал Swift 4

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

    guard let fieldText = textField.text else {
        return false
    }
    // Append the existing textfield text with the new character
    var text = fieldText + string
    // If it is the very first character, textfield text will be empty so take the 'string' and on delete also textfield text get deleted with a delay
    if range.location == 0{
       text = string
    }
    return true
}