使用 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 绑定到多个按钮并接收发送者