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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Не используйте UIControlEventValueChanged для UITextField. Вы хотите UIControlEventEditingChanged.

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

Свифт 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
    }
}

Ответ 7

Хотя значение присваивается программно, в этом случае textFieldDidChange никогда не вызывается, потому что фактически textField не изменился. Для этого внешнего события необходимо пройти

например, textfield.sendActions (для:.editingChanged) это вызовет событие редактирования изменено, и textFieldDidChange будет вызван даже после программного изменения значения.

Где применить это событие:

После присвоения значения тексту, например, textfield.text = "некоторое значение"

Ответ 8

Для Swift 3:

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

func textChanged() { 
 .... 
}