Подписка на UITextfield (управляющее событие, редактирование изменено) - PullRequest
0 голосов
/ 19 октября 2018

Я хочу использовать RxSwift, чтобы получить текст из UITextField после того, как сработало измененное редактирование UIControlEvent.

Чтобы сделать это:

Я подключил выход текстового поля из раскадровки к своемупосмотреть контроллер так.

@IBOutlet weak var currentPasswordTextField: UITextField!

и затем на свойстве didSet этого текстового поля я попытался это сделать:

@IBOutlet weak var currentPasswordTextField: UITextField!{
    didSet{
        currentPasswordTextField
            .rx
            .controlEvent(.editingChanged)
            .asObservable()
            .subscribe(onNext: { (text) in
            //I want here to print the text after the editing changed. 
               print(text)
            })
            .disposed(by: disposeBag)
    }
}

, но текст Void не является строкой ..

, если кто-либо можетПомогите быть благодарным.заранее спасибо.

PS Я не хочу использовать IBActions.

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

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

// Does not trigger didSet :
self.currentPasswordTextField.text = "text"
// Does trigger didSet
self.currentPasswordTextField = UITextField()
0 голосов
/ 20 октября 2018

Некоторые пункты:

  • asObservable() не требуется.
  • вы можете подписаться на .rx.text.orEmpty напрямую, но тогда вы получите события, когда текстовое поле начинается и заканчивается редактированием.

Вот, пожалуйста:

@IBOutlet weak var currentPasswordTextField: UITextField!{
    didSet{
        currentPasswordTextField
            .rx
            .controlEvent(.editingChanged)
            .withLatestFrom(currentPasswordTextField.rx.text.orEmpty)
            .subscribe(onNext: { (text) in
                //I want here to print the text after the editing changed.
                print(text)
            })
            .disposed(by: disposeBag)
    }
}

Что-то еще, о чем я думал прошлой ночью ...

Вставка этого кода в didSetбудет проблемой.Код Rx, как правило, ориентирован на вывод, а не на ввод.Из-за этого все, что идет в subscribe, вероятно, будет ссылаться на какой-то другой объект, который также должен существовать, и вы, вероятно, захотите иметь возможность ссылаться и на другие наблюдаемые.

Что я подразумеваю под вводомvs output centric?

императивный код имеет тенденцию быть input центрированным , когда вы хотите знать, что произойдет, когда кнопка нажата, у вас обычно есть одно место, чтобы посмотреть, действие кнопки,Однако, если вы хотите понять все, что влияет на конкретную метку, индикатор активности или любой другой вывод, вам придется просмотреть весь код.Каждая функция в контроллере представления может передавать информацию на выход, и некоторые из них, вероятно, имеют следующий вид.

Декларативный код имеет тенденцию быть ориентированным на выход , когда вы хотите знать все, что влияет на меткуВывод или то, что заставляет индикатор активности показывать / скрывать, как правило, есть одно место для поиска.Однако, если вы хотите понять все, что делает нажатие кнопки, вам придется просмотреть весь код, чтобы понять это.(Прекрасным примером этого является электронная таблица, если вы хотите узнать, как определяется выход для конкретной ячейки, вам нужно только взглянуть на формулу в этой ячейке, но если вы хотите знать всеЯчейки, на которые воздействует определенная ячейка, это боль.)

По моему опыту, для программистов сложнее всего обернуть голову при работе с Rx.

0 голосов
/ 19 октября 2018

Вы хотите подписаться на currentPasswordTextField.rx. text (или .text.orEmpty, если вам не нужна необязательная строка) вместо самого события управления.

Под капотом .text (что является псевдонимом).из .value) наблюдает за событиями управления [.allEditingEvents, .valueChanged] и возвращает значение.

Подробнее:

...