web-dev-qa-db-fra.com

RxSwift utilisant bindTo pour lier la variable <String> à UILabel ne fonctionne pas pour Swift 3.0 update

J'utilise RxSwift pour lier mon viewmodel à UILabel et UITexfield. UITextfield ceux n'ont aucun problème à se convertir en Swift 3, il suffit de remplacer rx_text par rx.text travaillé.

Mais pas pour UILabel. Sur Swift 2.2, J'ai utilisé:

self.viewModel.shiftNameText.asObservable().bindTo(self.shiftLabel.rx_text).addDisposableTo(self.disposeBag)

Pour Swift 3, J'utilise RxSwift 3.0.0-beta.1 et j'ai juste essayé de changer rx_text en rx.text, mais il ne compile pas et affiche cette erreur "Impossible de convertir la valeur de type 'AnyObserver<String?>' (aka 'AnyObserver<Optional<String>>') to expected argument type 'Variable<String>".

Est-ce que quelqu'un sait pourquoi et comment faire fonctionner cela? Merci.

13
JinglesBunny

UILabel's rx.text la propriété est de type AnyObserver<String?> vous devez donc mapper la valeur à une option

self.viewModel.shiftNameText
    .asObservable()
    .map { text -> String? in 
        return Optional(text)
    }
    .bind(to:self.shiftLabel.rx.text)
    .disposed(by:self.disposeBag)

ou en bref:

self.viewModel.shiftNameText
  .asObservable()
  .map { $0 }
  .bind(to:self.shiftLabel.rx.text)
  .disposed(by:self.disposeBag)

Voir https://github.com/ReactiveX/RxSwift/issues/875 pour d'autres solutions.

33
marcusficner