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

时间:2017-05-09 13:30:26

标签: ios swift validation rx-swift

我正在使用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}}。

我在这里做错了吗?我会感谢任何帮助。

2 个答案:

答案 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)
        }
    }
}