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!
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
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é!
Vous pouvez ajouter controlEvents à asObservable:
textField.rx.controlEvent([.editingChanged])
.asObservable().subscribe({ [unowned self] _ in
print("My text : \(self.textField.text ?? "")")
}).disposed(by: bag)
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)