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

Posted

技术标签:

【中文标题】使用 RxSwift 将多个 UITextField 绑定到类道具【英文标题】:Binding multiple UITextField to a class props with RxSwift 【发布时间】:2019-11-07 06:57:48 【问题描述】:

我愿意将 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。

【问题讨论】:

你到底想要什么样的行为? 我是 RxSwift 新手,我想为我的 TextFields 进行双向绑定。我的意思是我的 TextFields 在初始化我的 VC 时获得值,然后当我的字段更改时,我的类实例也可以更新 【参考方案1】:

单独绑定每个属性而不是整个 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

【讨论】:

以上是关于使用 RxSwift 将多个 UITextField 绑定到类道具的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift:将 PublishSubject 绑定到多个按钮并接收发送者

RxSwift 从一个创建多个 Observable

地图中的 RxSwift 多个可观察对象

RxSwift 订阅者接收多个事件

如何在 RxSwift 中将多个数据模型绑定到 TableView

如何使用 RxSwift 传递多个参数?