Подтвердить что ты не робот

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 не будет вызван. Но если я изменил текст, используя мою компьютерную клавиатуру, он почему-то вызван.

Является ли это намеренным?

4b9b3361

Ответ 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

введите описание изображения здесь

  1. После того, как вы измените текст textField из кода, добавьте также sendActionsLine

    taskTextField.text = nil
    taskTextField.sendActionsForControlEvents(UIControlEvents.EditingChanged)