プログラムによって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"
ありがとうございました!
私は同じ問題を抱えていた、どうやらスイーパーの答えは私にはうまくいかなかった。だからここに私がやったことですテキストフィールドのテキストを手動で設定するとき、テキストフィールドでsendActionsメソッドを呼び出します
textField.text = "Programmatically set text." textField.sendActions(for: .valueChanged)
もう少し掘り下げると、rx.text
はUIControlEvents
に依存しており、テキストを明示的に設定してもトリガーされません。
お役に立てれば
Key-Value監視互換オブジェクトのプロパティを監視する場合は、observe
!を呼び出します。
ここに例があります
textfield.rx.observe(String.self, "text").subscribe(onNext: { s in
print(s ?? "nil")
}).disposed(by: disposeBag)
これにより、ユーザーとコードの両方によって行われたtext
への変更が検出されます。
この手法を使用すると、text
だけでなく、キーパスを持つ他のプロパティも監視できます。
AsObservableにcontrolEventsを追加できます。
textField.rx.controlEvent([.editingChanged])
.asObservable().subscribe({ [unowned self] _ in
print("My text : \(self.textField.text ?? "")")
}).disposed(by: bag)
Uがtextfield.textをプログラムで設定している場合は、そこでアクションを実行できます。サブスクリプションブロックは必要ありません。
Textfieldは非アクティブ状態なので、textfield.textサブスクリプションは呼び出されません。むしろ、textfieldテキストを監視する必要があります。
テキストの変更にバインディングを使用すると、問題が解決します。
let textChange = Variable(true)
_ = textChange.asObservable().bindTo(textfield.rx.text)