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