2014-03-06 7 views
5

Ich versuche, den Status eines UISwitch an eine boolesche Eigenschaft in meinem Modell zu binden, indem ich ReactiveCocoa verwende. Ich begann mit:Den Status eines UISwitch mit einem Modell mit ReactiveCocoa verbinden

RACChannelTo(self.switch, on, @NO) = RACChannelTo(self.model, toggle, @NO); 

Dies ist, wie ich habe auf andere Teile meines Modells andere Ansichten für verbindlich, leider nichts für die UISwitch zu tun schien. Der Zustand des Modells hat keinen Einfluss auf den Schalter oder umgekehrt.

Also habe ich versucht:

RACChannelTo(self.model, toggle, @NO) = [self.switch rac_newOnChannel]; 

Dies scheint ok zu arbeiten, aber ich muss vorher den Schalter der Zustand manuell einrichten. So, jetzt habe ich:

self.switch.on = self.model.toggle; 
RACChannelTo(self.model, toggle, @NO) = [self.switch rac_newOnChannel]; 

Auch dies funktioniert, aber es scheint sehr unelegant im Vergleich zur Verwendung ReactiveCocoa mit anderen Kontrollen.

Gibt es keinen besseren Weg, dies zu tun?

Antwort

4

Sie können -rac_newOnChannel anstelle eines Kanals zum on des Switch verwenden. Das liegt daran, dass on nicht garantiert wird, dass sie KVO-konform modifiziert werden. Verwenden des Channel-Hooks im UIControlEventValueChanged-Event des Switches.

Um Verhalten wie:

RACChannelTo(self.switch, on, @NO) = RACChannelTo(self.model, toggle, @NO); 

Wenn der Schalter mit dem Wert aus dem Modell beginnt, können Sie den Kanal-Anschluss manuell tun können:

RACChannelTerminal *switchTerminal = [self.switch rac_newOnChannel]; 
RACChannelTerminal *modelTerminal = RACChannelTo(self.model, toggle, @NO); 
[modelTerminal subscribe:switchTerminal]; 
[[switchTerminal skip:1] subscribe:modelTerminal]; 
+0

Sinn macht. Es wäre schön, wenn das etwas aufgeräumt werden könnte, aber es wird für jetzt tun. Vielen Dank! –

Verwandte Themen