RxSwift:如何将 Bool 更改为 ObservableType?

Posted

技术标签:

【中文标题】RxSwift:如何将 Bool 更改为 ObservableType?【英文标题】:RxSwift: How can I change Bool to ObservableType? 【发布时间】:2019-10-13 02:23:36 【问题描述】:

我是 RxSwift 的新手,我想实现这一目标:

一个titleTextField、一个descTextField、一个confirmButton和一个submitButton。

在titleTextField和descTextField的text.count >= 5并且confirmButton被选中之前submitButton是unEnable的,所以我写了这些代码:

let titleValid = titleTextField.rx.text.orEmpty.map  (text) -> Bool in
    return text.count >= 5


let descValid = descTextField.rx.text.orEmpty.map  (text) -> Bool in
    return text.count >= 5


let isConfirm = confirmButton.rx.isSelected.asObserver().mapObserver  (selected) -> Bool in
    return selected


Observable.combineLatest(titleValid, descValid, isConfirm)  $0 && $1 && $2 .bind(to: submitButton.rx.isEnabled).disposed(by: disposeBag)

titleValiddescValid 可以很好地工作,但是isConfirm 有一个错误:

Argument type 'AnyObserver<Bool>' does not conform to expected type 'ObservableType'

如何将isConfirm 更改为ObservableType?如何纠正?

注意 RxSwift 的版本是 5.0.0

【问题讨论】:

按钮的isSelected 状态只能输入。您需要观察导致其设置为真/假的任何原因,而不是直接观察它。不要在视图中存储模型状态。是什么导致 isSelected 改变值? @DanielT。用户点击按钮导致 isSelected 更改 如果他们再次点击它会发生什么,isSelected 会变回 false 还是保持 true? @DanielT。点按一次就会更改值 【参考方案1】:

cmets 包含您的答案。重要的是点击confirmButton

let titleValid = titleTextField.rx.text.orEmpty.map  (text) -> Bool in
    return text.count >= 5


let descValid = descTextField.rx.text.orEmpty.map  (text) -> Bool in
    return text.count >= 5


let isConfirm = confirmButton.rx.tap
    .scan(false)  current, _ in !current 
    .startWith(false)

isConfirm
    .bind(to: confirmButton.rx.isSelected)
    .disposed(by: disposeBag)

Observable.combineLatest(titleValid, descValid, isConfirm)  $0 && $1 && $2 
    .bind(to: submitButton.rx.isEnabled)
    .disposed(by: disposeBag)

【讨论】:

感谢您的帮助,但是使用您的代码,确认按钮在被录制时将永远被选中。点击确认按钮的功能是:confirmButton.isSelected = !confirmButton.isSelected 不要像使用模型一样使用视图。将它们分开。我已更新代码以切换确认按钮。

以上是关于RxSwift:如何将 Bool 更改为 ObservableType?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 RxSwift 观察 Bool 属性?

如何将菜单项更改为选中或未选中?

如何将rootviewcontroller更改为堆栈中的第三个viewcontroller

将设备更改为 ipad 视网膜时如何解决 Exe Bad access

Observable<Bool> If else 在 RxSwift

如何读取 RxSwift 属性的值? <驱动程序>布尔