Привязать значение поля uitext к viewModel с помощью mvvm - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь связать UITextField с моделью представления, однако, что бы я ни делал, я продолжаю получать 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
    }
}

ViewController

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 голосов
/ 04 ноября 2018

Функция 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")
    }
  }
}
...