使用mvvm将uitextfield值绑定到viewModel

时间:2018-11-04 12:30:49

标签: swift rx-swift

我正在尝试将UITextField绑定到viewModel,但是无论如何我都不断得到Cannot invoke 'bind' with an argument list of type '(to: EmailViewModel)。我在做什么错了?

SignUpViewModel

class SignUpViewModel {

    let model: SignUpModel
    private let disposeBag = DisposeBag()

    let emailFieldViewModel = EmailViewModel()

    init(model :SignUpModel) {
        self.model = model
    }


}

EmailViewModel

struct EmailViewModel : FieldViewModel {

    var value: Variable<String> = Variable("")
    var errorValue: Variable<String?> = Variable(nil)

    let title = "Email"
    let errorMessage = "Email is wrong"

    func validate() -> Bool {
        let emailPattern = "[A-Z0-9a-z._%+-]+@([A-Za-z0-9.-]{2,64})+\\.[A-Za-z]{2,64}"
        guard validateString(value.value, pattern:emailPattern) else {
            errorValue.value = errorMessage
            return false
        }
        errorValue.value = nil
        return true
    }
}

视图控制器

class SignUpViewController: UIViewController {

    @IBOutlet var emailField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        configureBinding()

    }

    private func configureBinding() {

        // binding
        self.emailField.rx.text.bind(to: viewModel.emailFieldViewModel)

    }

}

1 个答案:

答案 0 :(得分:1)

bind函数需要一个符合ObserverType协议的对象。这里,EmailViewModel不符合该类型,因此会出错。

编写扩展名以使EmailViewModel符合ObserverType协议将解决编译错误。

extension EmailViewModel: ObserverType {
  func on(_ event: Event<String?>) {
    switch event {
    case .next(let newValue): value.value = newValue ?? ""
    case .error(_), .completed: fatalError("Completion and error are not handled")
    }
  }
}