如何通过以编程方式更改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"
谢谢!
答案 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)