Ответ 1
Вы можете настроить делегат и использовать
- (BOOL) textField: (UITextField *) textField shouldChangeCharactersInRange: (NSRange) range replacementString: (NSString *) string;
Как я могу получить метод textDidChange для UITextField? Мне нужно вызвать метод каждый раз, когда в текстовое поле внесено изменение. Это возможно? Спасибо!
Вы можете настроить делегат и использовать
- (BOOL) textField: (UITextField *) textField shouldChangeCharactersInRange: (NSRange) range replacementString: (NSString *) string;
Вы можете использовать UITextFieldTextDidChangeNotification
для вызова метода всякий раз, когда изменяется текстовое поле. Добавьте это в свой init
:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextFieldTextDidChangeNotification object:nil];
Вы также можете выбрать цель и селектор для события UIControlEventEditingChanged
. Например:
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]
Обратите внимание, что это будет вызвано только для внесенных пользователем изменений в текстовое поле и не будет вызываться автоматически при программном настройке текста.
Разрабатывая далее на Бена Готлиба, ответьте выше, используя 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, когда в текстовом поле не отображается текст
Я нашел некоторые проблемы, когда вы используете replaceCharactersInRange
в делегате shouldChangeCharactersInRange.
Пример: во вьетнамской клавиатуре строка aa
→ â
, поэтому, если вы используете метод replaceCharactersInRange
то replaceCharactersInRange
неверные результаты.
Вы можете попробовать в этом случае событие UIControlEventEditingChanged
:
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]
Быстрое решение
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let newString = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string)
return true
}
Ниже я использовал 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
}