web-dev-qa-db-fra.com

Comment obtenez-vous un signal chaque fois qu'une propriété de texte UITextField change dans RxSwift

Comment obtenez-vous un signal des modifications apportées par programme à la propriété de texte UITextField? L'utilisation de rx.text signale uniquement un signal lorsque l'utilisateur entre le texte au clavier. Si vous définissez textField.text par programme, le signal ne se déclenche pas.

Voici comment j'utilise rx.text

(self.phoneNumberTextField.rx.text).orEmpty.subscribe(onNext: { [weak self] (phone) in
         // do something
    }).addDisposableTo(disposeBag)
    self.phoneNumberTextField.text = "this is for test"

Je vous remercie!

15
Ethan Cheung

J'ai eu les mêmes problèmes, apparemment la réponse de la balayeuse n'a pas fonctionné pour moi. Voici donc ce que j'ai fait Lorsque j'ai défini le texte pour le champ de texte manuellement, j'appelle la méthode sendActions sur le champ de texte

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

En creusant un peu plus, j'ai réalisé que le rx.text dépend de UIControlEvents et ceux-ci ne sont pas déclenchés lorsque vous définissez explicitement le texte.

J'espère que cela t'aides

6
AjinkyaSharma

Lorsque vous souhaitez observer une propriété d'objet compatible d'observation de valeur-clé, appelez simplement observe!

Voici un exemple

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

Cela détectera les modifications apportées à text qui sont apportées par l'utilisateur et votre code.

Vous pouvez utiliser cette technique non seulement pour observer text, mais aussi pour toute autre propriété qui a un chemin de clé!

5
Sweeper

Vous pouvez ajouter controlEvents à asObservable:

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

Si vous définissez textfield.text par programme, vous pouvez effectuer toutes les actions là-bas. Vous n'avez pas besoin du bloc d'abonnement.

Comme textfield est inactif, votre abonnement textfield.text ne sera pas appelé, vous devez plutôt observer le texte textfield.

Utilisez des liaisons pour les modifications de texte résoudra votre problème.

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