每次UxextField文本属性在RxSwift中更改时,如何获取信号

时间:2017-08-11 10:37:57

标签: ios swift rx-swift

如何通过以编程方式更改UITextField文本属性来获取信号?通过使用rx.text仅在用户通过键盘输入文本时报告信号。如果以编程方式设置textField.text,则信号不会触发。

这就是我使用rx.text

的方式
(self.phoneNumberTextField.rx.text).orEmpty.subscribe(onNext: { [weak self] (phone) in
         // do something
    }).addDisposableTo(disposeBag)
    self.phoneNumberTextField.text = "this is for test"

谢谢!

4 个答案:

答案 0 :(得分:5)

当您希望观察键值观察兼容对象的属性时,只需调用observe

这是一个例子

textfield.rx.observe(String.self, "text").subscribe(onNext: { s in
    print(s ?? "nil")
}).disposed(by: disposeBag)

这将检测用户和您的代码对text所做的更改。

您可以使用此技术不仅观察text,还可以观察具有关键路径的任何其他属性!

答案 1 :(得分:3)

我遇到了同样的问题,显然清道夫的答案对我没有用。 所以这就是我所做的 手动设置文本字段的文本时,我在文本字段上调用sendActions方法

textField.text = "Programmatically set text." textField.sendActions(for: .valueChanged)

在深入研究时,我意识到rx.text取决于UIControlEvents 并且当您显式设置文本时不会触发这些操作。

希望这会有所帮助

答案 2 :(得分:2)

您可以将controlEvents添加为asObservable:

    textField.rx.controlEvent([.editingChanged])
        .asObservable().subscribe({ [unowned self] _ in
            print("My text : \(self.textField.text ?? "")")
        }).disposed(by: bag)

答案 3 :(得分:-1)

如果你以编程方式设置textfield.text,那么你可以在那里执行任何操作。您不需要订阅块。

由于textfield处于非活动状态,因此textfield.text订阅不会被调用,而是必须观察文本字段文本。

使用绑定进行文本更改将解决您的问题。

let textChange = Variable(true)
_ = textChange.asObservable().bindTo(textfield.rx.text)