RxSwift验证按钮颜色设置不正确

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

我在这里做错什么了吗?感谢您的帮助。

iWh*_*Buy 5

您是否尝试过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)