Привязка нескольких UITextField к классу реквизита с помощью RxSwift - PullRequest
0 голосов
/ 07 ноября 2019

Я готов использовать RxSwift для привязки MVVM между значениями модели и контроллерами представления. Я хочу связать свои поля формы с моими свойствами класса. Например:

struct UserDetail {

    var firstName: String?
    var lastName: String?
    var nickName: String?
    var email: String?
    var nationalId: String?
    var birthday: String?


    init?() {}
}

и теперь я хочу привязать экземпляр этого класса к моим UITextFields и определить его в моей ViewModel следующим образом:

var userData = UserDetail()
userData.firstName = "myFirstName"

var userDetail = BehaviorSubject<UserDetail?>(value: userData)

и в этот момент яне знаю, как реализовать мой ViewController.

1 Ответ

1 голос
/ 08 ноября 2019

Возможно, было бы лучше связать каждое свойство отдельно, а не целый объект UserDetail, но если вам нужно сделать это, то вы можете попробовать что-то вроде этого в вашем контроллере вида:

// bind to view:
Observable.combineLatest(
    myView.firstNameTextField.rx.text,
    myView.lastNameTextField.rx.text,
    myView.nickNameTextField.rx.text,
    myView.emailTextField.rx.text,
    myView.nationalIdTextField.rx.text,
    myView.birthdayTextField.rx.text
)
.map {
    let userDetail = UserDetail()
    userDetail.firstName = $0
    userDetail.lastName = $1
    userDetail.nickName = $2
    userDetail.email = $3
    userDetail.nationalId = $4
    userDetail.birthday = $5
    return userDetail
}
.bind(to: viewModel.userDetail)
.disposed(by: disposeBag)

// bind to viewModel:
viewModel.userDetail
    .map { $0.firstName }
    .distinctUntilChanged()  // you may consider omitting this part
    .bind(to: myView.firstNameTextField.rx.text)
    .disposed(by: disposeBag)

viewModel.userDetail
    .map { $0.lastName }
    .distinctUntilChanged()
    .bind(to: myView.lastNameTextField.rx.text)
    .disposed(by: disposeBag)

// ... and so on
...