简体   繁体   English

使用 RxSwift 将多个 UITextField 绑定到 class 道具

[英]Binding multiple UITextField to a class props with RxSwift

I am willing to use RxSwift for MVVM binding between model values & view controllers.我愿意将 RxSwift 用于 model 值和视图控制器之间的 MVVM 绑定。 I want to bind my form fields to my class properties.我想将我的表单字段绑定到我的 class 属性。 For example:例如:

struct UserDetail {

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


    init?() {}
}

and now I want to bind an instance of this class to my UITextFields and I define it in my ViewModel like this:现在我想将此 class 的实例绑定到我的 UITextFields 并在我的 ViewModel 中定义它,如下所示:

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

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

and at this moment i dont have no idea to how should implement my ViewController.目前我不知道应该如何实现我的 ViewController。

It might probably be a better idea to bind each property separately, rather than an entire UserDetail object, but if you have to do so, then you can try something like this in your view controller:单独绑定每个属性而不是整个UserDetail object 可能是一个更好的主意,但是如果你必须这样做,那么你可以在你的视图 controller 中尝试这样的事情:

// 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM