2017-05-09 16 views
0

RxSwiftを使用してユーザーからの入力を検証しています。すべて有効な場合は、ボタンを有効にしてその色を変更します。私のボタンクラスでは、私はVariable<Bool>を作成しました:RxSwift検証ボタンの色が正しく設定されていません

initWithCoder
var valid = Variable(false) 

私はそのようなことをやっている:

valid.asObservable() 
    .subscribe(onNext: { [weak self] valid in 
     self?.isEnabled = valid 
     self?.titleLabel?.textColor = valid ? .white : .black 
    }) 
    .addDisposableTo(disposeBag) 

私は入力を検証し、validateDate()(私はしませんと呼ばれるObservable<Bool>を返すメソッドを持っています)簡潔にするために、ここでそれを投稿:

let dataValid = viewModel.validateData() 

dataValid 
    .bind(to: submitButton.valid) 
    .addDisposableTo(disposeBag) 

問題がsubscri中もののvalid値ということであり、 ptionが正しく、有効化ボタンが完全に機能していれば、ボタンの色を正しく設定すると正しく動作しません。有効になったときではなく、次の発光時に色が変わるようです。true

ここで何か問題がありますか?私はどんな助けでも感謝しています。

+0

の賛成でUIBindingObserverを落と​​していますが、メインスレッド上で色を変更します? – Scriptable

+0

.subscribeの前に.observeOn(MainScheduler.instance)を追加しようとしましたが、うまくいきませんでした。 – jonaszmclaren

答えて

3

setTitleColorボタンのタイトルカラーを変更しようとしましたか?あなたは、UIバインディングのためUIBindingObserverを使用して検討するかもしれない

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 
+0

ありがとう、setTitleColorはトリックをやった:) – jonaszmclaren

1

スウィフト4、RxCocoa 4は今バインダー

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) 
     } 
    } 
} 
関連する問題