2017-05-09 4 views
0

Ich benutze RxSwift, um Eingaben vom Benutzer zu validieren, wenn alles gültig ist Ich möchte eine Schaltfläche aktivieren und ändern Sie ihre Farbe.RxSwift Validierung Schaltfläche Farbe ist nicht richtig eingestellt

var valid = Variable(false) 

In initWithCoder so, was ich so mache:: In meiner Schaltfläche Klasse I Variable<Bool> erstellt haben

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

Ich habe eine Methode, die Eingabe bestätigt und gibt ein Observable<Bool> genannt validateDate() (werde ich nicht poste es hier der Kürze halber):

let dataValid = viewModel.validateData() 

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

das Problem ist, dass, obwohl der valid Wert in subscri ption ist korrekt und die Aktivierung der Taste funktioniert einwandfrei, die Einstellung der Tastenfarbe funktioniert nicht richtig, weil es so aussieht, als ob sie bei der nächsten Emission ihre Farbe ändert, nicht wenn sie gültig ist true.

Mache ich hier etwas falsch? Ich wäre dankbar für jede Hilfe.

+0

ändern Sie die Farbe auf dem Haupt-Thread ? – Scriptable

+0

Ich habe versucht, .observeOn (MainScheduler.instance) vor .subscribe hinzuzufügen, aber es hat nicht geholfen. – jonaszmclaren

Antwort

3

Haben Sie versucht, setTitleColor zu ändern, um die Titelfarbe der Schaltfläche zu ändern?

Sie könnten mit UIBindingObserver für UI-Bindungen betrachten:

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

Vielen Dank, setTitleColor hat den Trick gemacht :) – jonaszmclaren

1

Swift 4, RxCocoa 4 abgesunken ist jetzt UIBindingObserver zugunsten von 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) 
     } 
    } 
} 
Verwandte Themen