it-swarm.com.ru

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

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

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

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

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

66
Andrew Lauer Barinov

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

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

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

197
Mark Adams

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

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

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

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

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

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

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

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

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

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
balazs630