How do you get a signal from programmatically made changes to UITextField text property? By using rx.text only reports a signal when the user input the text by keyboard. If you set textField.text programmatically, the signal doesn't fire.
This is how I'm using rx.text
(self.phoneNumberTextField.rx.text).orEmpty.subscribe(onNext: { [weak self] (phone) in
// do something
}).addDisposableTo(disposeBag)
self.phoneNumberTextField.text = "this is for test"
Thank you!
I had the same issues, apparently sweeper's answer did not work for me. So here is what I did When I set the text for textfield manually, I call sendActions method on the text field
textField.text = "Programmatically set text."
textField.sendActions(for: .valueChanged)
On digging a little bit more, I realized that the rx.text
depends on UIControlEvents
and these are not triggered when you explicitly set the text.
Hope this helps
You can add controlEvents to asObservable:
textField.rx.controlEvent([.editingChanged])
.asObservable().subscribe({ [unowned self] _ in
print("My text : \(self.textField.text ?? "")")
}).disposed(by: bag)
When you wish to observe a property of key-value observing compatible object, just call observe
!
Here is an example
textfield.rx.observe(String.self, "text").subscribe(onNext: { s in
print(s ?? "nil")
}).disposed(by: disposeBag)
This will detect changes to text
that are made by both the user and your code.
You can use this technique to not just observe text
, but also any other property that has a key path!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With