我正在使用RxSwift验证来自用户的输入,如果一切都有效,我想启用按钮并更改其颜色。在我的按钮类中,我创建了Variable<Bool>
:
var valid = Variable(false)
在initWithCoder
我正在做这样的事情:
valid.asObservable()
.subscribe(onNext: { [weak self] valid in
self?.isEnabled = valid
self?.titleLabel?.textColor = valid ? .white : .black
})
.addDisposableTo(disposeBag)
我有一个方法可以验证输入并返回一个名为Observable<Bool>
的{{1}}(为简洁起见,我不会在此处发布):
validateDate()
问题是,虽然订阅中的let dataValid = viewModel.validateData()
dataValid
.bind(to: submitButton.valid)
.addDisposableTo(disposeBag)
值是正确的并且启用按钮完美地工作,但设置按钮的颜色不能正常工作,因为它似乎在下一次发射时改变颜色,而不是在有效时变为{ {1}}。
我在这里做错了吗?我会感谢任何帮助。
答案 0 :(得分:4)
您是否尝试过setTitleColor
更改按钮的标题颜色?
您可以考虑将UIBindingObserver
用于UI绑定:
import PlaygroundSupport
import UIKit
import RxSwift
import RxCocoa
extension Reactive where Base: UIButton {
var valid: AnyObserver<Bool> {
return UIBindingObserver(UIElement: base, binding: { (button: UIButton, valid: Bool) in
button.isEnabled = valid
button.setTitleColor(valid ? .white : .black, for: .normal)
}).asObserver()
}
}
let button = UIButton()
button.frame = CGRect(x: 0, y: 0, width: 100, height: 50)
button.backgroundColor = UIColor.orange
button.setTitle("Title", for: .normal)
Observable<Int>
.timer(0, period: 1, scheduler: MainScheduler.instance)
.map({ $0 % 2 == 0})
.bind(to: button.rx.valid)
PlaygroundPage.current.liveView = button
答案 1 :(得分:3)
Swift 4,RxCocoa 4 现已放弃UIBindingObserver而转向Binder
extension Reactive where Base : UIButton {
public var valid : Binder<Bool> {
return Binder(self.base) { button, valid in
button.isEnabled = valid
button.setTitleColor(valid ? .white : .black, for: .normal)
}
}
}