【发布时间】:2017-12-27 08:14:34
【问题描述】:
我愿意将 RxSwift 用于模型值和视图控制器之间的 MVVM 绑定。我想关注这个realm.io tutorial,但从那时起绑定显然发生了变化,示例代码无法编译。这是示例代码,我认为我已经修复了最严重的错别字/遗漏的东西:
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)
}
}
控制器绑定无法编译。跟踪执行这些操作的正确方法几乎是不可能的,因为 RxSwift 文档非常无用,而且 Xcode 自动完成功能没有提供任何有用的建议。
第一个问题是这个绑定,它不能编译:
usernameTextField.rx.text.bindTo(viewModel.username).addTo(disposeBag)
错误:
LoginViewController.swift:15:35: Cannot invoke 'bindTo' with an argument list of type '(Variable<String>)'
我尝试了以下方法,但没有运气:
1) usernameTextField.rx.text.bind(to: viewModel.username).addTo(disposeBag) - 错误仍然存在:
LoginViewController.swift:15:35: Cannot invoke 'bind' with an argument list of type '(to: Variable<String>)'
2) let _ = viewModel.username.asObservable().bind(to: passwordTextField.rx.text)
let _ = viewModel.username.asObservable()
.map { $0 }
.bind(to: usernameTextField.rx.text)
第二个实际上编译,但不起作用(即 viewModel.username 没有改变)
这里的主要问题是我在将参数传递给bind 和bind(to: 方法时会失明,因为自动补全在这里并没有真正的帮助.. 我使用的是 swift 3 和 Xcode 8.3.2。
【问题讨论】: