首页 > 解决方案 > RxSwift:如何将 Bool 更改为 ObservableType?

问题描述

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

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

submitButton 是 unEnable 直到 titleTextField 和 descTextField 的 text.count >= 5 并选择了 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.isSelected.asObserver().mapObserver { (selected) -> Bool in
    return selected
}

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

它适用于titleValidand descValid,但是,有一个错误isConfirm

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

我该如何isConfirm更改ObservableType?如何纠正它?

注意 RxSwift 的版本是 5.0.0

标签: rx-swift

解决方案


评论包含您的答案。重要的是敲击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)

推荐阅读