Как я могу получить метод textDidChange (как для UISearchBar) для UITextField? - PullRequest
14 голосов
/ 17 декабря 2009

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

Ответы [ 7 ]

47 голосов
/ 17 декабря 2009

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

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextFieldTextDidChangeNotification object:nil];
20 голосов
/ 17 декабря 2009

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

- (BOOL) textField: (UITextField *) textField shouldChangeCharactersInRange: (NSRange) range replacementString: (NSString *) string;
3 голосов
/ 03 мая 2016

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

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

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

1 голос
/ 05 октября 2016

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

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

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

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]
1 голос
/ 17 октября 2014

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

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

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

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

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

Приведенный ниже код исправляет задержку символа

- (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, когда в textField нет текста

0 голосов
/ 22 декабря 2017

Ниже приведено то, что я использовал 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
}
0 голосов
/ 18 августа 2015

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

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    let newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)
    return true
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...