UITextField «значение изменено» не срабатывает при обновлении поля - PullRequest
66 голосов
/ 22 ноября 2011

У меня есть IBAction, который я подключил к элементу UITextField в Интерфейсном Разработчике. (Запуск по событию «значение изменено»)

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

Когда я запускаю свое приложение, TextField обновляется, когда я настраиваю ползунок, но событие «значение изменено» не срабатывает, когда это происходит. Событие изменения значения также не срабатывает, когда я вручную редактирую TextField. (Хотя использование триггера «Отредактировать конец» приводит к его срабатыванию).

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

Ответы [ 7 ]

199 голосов
/ 22 ноября 2011

Не используйте UIControlEventValueChanged для UITextField. То, что вы хотите, это UIControlEventEditingChanged.

70 голосов
/ 11 января 2013

Чтобы получить EditingChanged textfield event, я предложил добавить селектор как

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

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

-(void)textChanged:(UITextField *)textField
{
    NSLog(@"textfield data %@ ",textField.text);
}
11 голосов
/ 20 октября 2014

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

(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
2 голосов
/ 24 октября 2017

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

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

  override open var text: String? {
        didSet {
            myValueDidChange()
        }
    }
2 голосов
/ 22 ноября 2011

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

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
0 голосов
/ 07 апреля 2019

Swift 4:

class YourViewController: UIViewController {
    // MARK: Outlets
    @IBOutlet weak var titleTextField: UITextField!

    // MARK: View lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()
        titleTextField.delegate = self
    }
}

// MARK: UITextFieldDelegate methods
extension YourViewController: UITextFieldDelegate {
    func textField(_ textField: UITextField,
                   shouldChangeCharactersIn range: NSRange,
                   replacementString string: String) -> Bool {
        print("changed")
        return true
    }
}
0 голосов
/ 06 марта 2017

Для Swift 3 :

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

func textChanged() { 
 .... 
}
...