UITextField de liaison à ViewModel avec RxSwift

Je suis prêt à utiliser RxSwift pour MVVM de liaison entre les valeurs de modèle & afficher les contrôleurs. J'ai voulu suivre ce royaume.io tutoriel, mais la liaison n'a apparemment changé depuis, et l'exemple de code ne compile pas. Voici un exemple de code, où je pense que j'ai résolu le pire des fautes de frappe /manquant choses:

LoginViewModel.swift

import RxSwift

struct LoginViewModel {

    var username = Variable<String>("")
    var password = Variable<String>("")

    var isValid : Observable<Bool>{
        return Observable.combineLatest(self.username.asObservable(), self.password.asObservable())
        { (username, password) in
            return username.characters.count > 0
                && password.characters.count > 0
        }
    }
} 

LoginViewController.swift

import RxSwift
import RxCocoa
import UIKit

class LoginViewController: UIViewController {
    var usernameTextField: UITextField!
    var passwordTextField: UITextField!
    var confirmButton: UIButton!

    var viewModel = LoginViewModel()

    var disposeBag = DisposeBag()

    override func viewDidLoad() {
        usernameTextField.rx.text.bindTo(viewModel.username).addTo(disposeBag)
        passwordTextField.rx.text.bindTo(viewModel.password).addTo(disposeBag)

        //from the viewModel
        viewModel.rx.isValid.map { $0 }
            .bindTo(confirmButton.rx.isEnabled)
    }
}

Le contrôleur de liaisons ne compile pas. Il est à peu près impossible de suivre la manière correcte de le faire, comme le RxSwift la documentation est assez inutile, et Xcode l'autocomplétion ne pas proposer quelque chose d'utile.

La première question est avec cette liaison, qui ne compile pas:
usernameTextField.rx.text.bindTo(viewModel.username).addTo(disposeBag)

L'erreur:

LoginViewController.swift:15:35: Cannot invoke 'bindTo' with an argument list of type '(Variable<String>)'

J'ai essayé ce qui suit, mais sans succès:

1) usernameTextField.rx.text.bind(to: viewModel.username).addTo(disposeBag) - L'erreur persiste:
LoginViewController.swift:15:35: Cannot invoke 'bind' with an argument list of type '(to: Variable<String>)'

2)
let _ = viewModel.nom d'utilisateur.asObservable().bind (: passwordTextField.rx.texte)

let _ = viewModel.username.asObservable()
            .map { $0 }
            .bind(to: usernameTextField.rx.text)

Cette deuxième on le compile, mais ne fonctionne pas (ie. viewModel.nom d'utilisateur ne change pas)

Le principal problème est ici que je suis prise de vue à l'aveugle lors du passage de paramètres à la bind et bind(to: méthodes, depuis l'auto-complétion n'est pas vraiment utile ici.. je suis en utilisant swift 3 et Xcode 8.3.2.

OriginalL'auteur satellink | 2017-07-21