jon*_*ren 0 validation ios swift rx-swift
我正在使用RxSwift验证来自用户的输入,如果所有内容都有效,我想启用一个按钮并更改其颜色。在我的按钮类中,我创建了Variable<Bool>:
var valid = Variable(false)
Run Code Online (Sandbox Code Playgroud)
在initWithCoder我做这样的事情:
valid.asObservable()
.subscribe(onNext: { [weak self] valid in
self?.isEnabled = valid
self?.titleLabel?.textColor = valid ? .white : .black
})
.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)
我有一个验证输入并返回一个方法Observable<Bool>叫validateDate()(我不会张贴在这里为简便起见):
let dataValid = viewModel.validateData()
dataValid
.bind(to: submitButton.valid)
.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)
问题是,尽管valid订阅中的值正确并且启用按钮可以正常工作,但是设置按钮的颜色不能正常工作,因为看起来它在下次发射时会改变颜色,而不是在有效时变为true。
我在这里做错什么了吗?感谢您的帮助。
您是否尝试过setTitleColor更改按钮的标题颜色?
您可能会考虑使用UIBindingObserverUI绑定:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1291 次 |
| 最近记录: |