web-dev-qa-db-ja.com

RxSwiftでUITextFieldテキストプロパティが変更されるたびに信号を取得する方法

プログラムによって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"

ありがとうございました!

15
Ethan Cheung

私は同じ問題を抱えていた、どうやらスイーパーの答えは私にはうまくいかなかった。だからここに私がやったことですテキストフィールドのテキストを手動で設定するとき、テキストフィールドでsendActionsメソッドを呼び出します

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

もう少し掘り下げると、rx.textUIControlEventsに依存しており、テキストを明示的に設定してもトリガーされません。

お役に立てれば

6
AjinkyaSharma

Key-Value監視互換オブジェクトのプロパティを監視する場合は、observe!を呼び出します。

ここに例があります

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

これにより、ユーザーとコードの両方によって行われたtextへの変更が検出されます。

この手法を使用すると、textだけでなく、キーパスを持つ他のプロパティも監視できます。

5
Sweeper

AsObservableにcontrolEventsを追加できます。

    textField.rx.controlEvent([.editingChanged])
        .asObservable().subscribe({ [unowned self] _ in
            print("My text : \(self.textField.text ?? "")")
        }).disposed(by: bag)
4
Ramesh R C

Uがtextfield.textをプログラムで設定している場合は、そこでアクションを実行できます。サブスクリプションブロックは必要ありません。

Textfieldは非アクティブ状態なので、textfield.textサブスクリプションは呼び出されません。むしろ、textfieldテキストを監視する必要があります。

テキストの変更にバインディングを使用すると、問題が解決します。

let textChange = Variable(true)
_ = textChange.asObservable().bindTo(textfield.rx.text)
0
Arnav