UITextField "значение изменено" не срабатывает при обновлении поля


у меня есть IBAction что я подключился к UITextField элемент в Построителе интерфейса. (Стрельба по событию" value changed")

у меня тоже UISlider это автоматически обновляет элемент TextField, когда его значение корректируется.

когда я запускаю свое приложение, текстовое поле обновляется при настройке ползунка, но событие" изменение значения " не срабатывает, когда это происходит. Событие изменения значения также не срабатывает, когда я редактирую текстовое поле вручную. (Хотя использование триггера Did Editing End вызывает его срабатывание).

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

6 61

6 ответов:

как предложил Теронин, используйте UITextFieldDelegate и реализовать следующий метод

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

не используйте UIControlEventValueChanged на UITextField. То, что вы хотите UIControlEventEditingChanged.

и EditingChanged textfield event, Я предложил добавить селектор как

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

при изменении значения текстового поля, измененное значение вы получите от этого textChanged: селектор.

-(void)textChanged:(UITextField *)textField
{
    NSLog(@"textfield data %@ ",textField.text);
}

Если вы назначаете делегат текстовому полю, обратите внимание, что (когда вы возвращаете NO из метода делегата ниже, событие (изменение редактирования) не будет инициировано. Рассмотрите возможность вызова прослушивателя событий, когда вы возвращаете NO из этого метода

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

старый вопрос, но первый результат поиска я нашел, и ни один из ответов не является удовлетворительным. Я нашел это решение, чтобы работать лучше:Swift UITextField подкласс обрабатывать изменение текста программно.

переопределите свойство text UITextField, чтобы добавить didSet (), и вызовите оттуда функцию изменения значения.

  override open var text: String? {
        didSet {
            myValueDidChange()
        }
    }

на Swift 3:

textField.addTarget(self, action: #selector(textChanged), for: .valueChanged)

func textChanged() { 
 .... 
}