UIControlEventEditingChanged не запускается при использовании setText поля UITextfield
В настоящее время я пытаюсь отслеживать состояния текстового поля.
Я использую настраиваемый datePicker, который устанавливает текст через -setText
[self.textField setText:[self.dateFormatter stringFromDate:self.date]];
Внутри моего textFieldDelegate я написал следующий код:
-(void)viewDidLoad {
[super viewDidLoad];
self.travelToOnTextField.delegate = self;
[self.travelToOnTextField addTarget:self action:@selector(travelToOnTextFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
}
-(void)travelToOnTextFieldDidChange:(id)sender
{
NSLog(@"Event Handler called");
}
Если я изменяю текст через свой пользовательский Datepicker, метод travelToOnDateTextFieldDidChange
не будет вызван. Но если я изменил текст, используя мою компьютерную клавиатуру, он почему-то вызван.
Является ли это намеренным?
Ответы
Ответ 1
Мне пришлось оценить этот вопрос, потому что это очень важно.
Похоже, это изменилось в iOS6. Может быть, даже iOS5. Это событие USED является предпочтительным методом наблюдения за изменениями текста в UITextField. Я использую его с iOS3. После перекомпиляции моего приложения на iOS6 для выполнения некоторых обновлений он загадочно прекратил работать. Части моего приложения используют:
[UITextField insertText];
и другие используют
[UITextField setText];
или
UITextField.text = @"xxx";
По какой-либо причине важно отметить, что события setText больше не запускают событие Editing Changed. Если вы используете метод insertText, он все равно работает.
Итак, если вы находитесь в привязке, и вам просто нужно быстро исправить, вы можете изменить свой код:
textField.text;
или
[textField setText:@"xxx"];
к
textField.text = @"";
[textField insertText:@"new text"];
Это также работает:
[((UITextField*)view) sendActionsForControlEvents:UIControlEventEditingChanged];
Надеюсь, это поможет кому-то, потому что я потратил целый день на то, чтобы понять, почему этот код внезапно прекратил работать, когда я перешел на iOS6.
Вы также можете использовать NSNotificationCenter. См. Ссылку UITextField для получения дополнительной информации:
https://developer.apple.com/documentation/uikit/uitextfield
Ответ 2
Просто вызовите sendActionsForControlEvents:
после того, как вы установите текст:
self.textField.text = xxx;
[self.textField sendActionsForControlEvents:UIControlEventEditingChanged];
Протестировано на iOS 9.
Ответ 3
В документации написано:
UIControlEventEditingChanged
A touch making an editing change in a UITextField objet.
Available in iOS 2.0 and later.
Declared in UIControl.h.
Значит сенсорный?
Ответ 4
В Swift 2.2+, основанный на ответе @Shaolo
- Подключите IBAction, обратите внимание, чтобы изменить тип события по умолчанию на
EditingChanged
![введите описание изображения здесь]()
-
После того, как вы измените текст textField из кода, добавьте также sendActionsLine
taskTextField.text = nil
taskTextField.sendActionsForControlEvents(UIControlEvents.EditingChanged)