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

Eth*_*ung 9 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"
Run Code Online (Sandbox Code Playgroud)

谢谢!

Aji*_*rma 7

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

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

在进行更多的挖掘时,我意识到,rx.text取决于UIControlEvents并且在您显式设置文本时不会触发这些依赖。

希望这可以帮助

  • 如果可能,将投票1000次 (2认同)

Swe*_*per 5

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

这是一个例子

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

这将检测text用户和代码所做的更改.

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

  • 这对我来说不起作用......我最初只得到一个空字符串事件,然后什么都没有 (3认同)

Ram*_*R C 5

您可以将controlEvents添加为asObservable:

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