I am trying to bind a UISwitch's on state to a boolean property in my model using ReactiveCocoa. I started with:
RACChannelTo(self.switch, on, @NO) = RACChannelTo(self.model, toggle, @NO);
This is how I've been binding other views to other parts of my model, unfortunately it didn't appear to do anything for the UISwitch. The model's state does not affect the switch, or vice versa.
So I tried:
RACChannelTo(self.model, toggle, @NO) = [self.switch rac_newOnChannel];
This appears to work ok, but I have to manually set up the switch's state beforehand. So, right now I have:
self.switch.on = self.model.toggle;
RACChannelTo(self.model, toggle, @NO) = [self.switch rac_newOnChannel];
Again, this works, but it seems very inelegant compared to using ReactiveCocoa with other controls.
Isn't there a better way to do this?
You're spot-on to use -rac_newOnChannel
instead of a channel to the switch's on
. That's because on
isn't guaranteed to be modified in a KVO-compliant way. Using the channel hooks into the switch's UIControlEventValueChanged
event.
To get behavior like:
RACChannelTo(self.switch, on, @NO) = RACChannelTo(self.model, toggle, @NO);
Where the switch starts with the value from the model, you can do the channel hook-up manually:
RACChannelTerminal *switchTerminal = [self.switch rac_newOnChannel];
RACChannelTerminal *modelTerminal = RACChannelTo(self.model, toggle, @NO);
[modelTerminal subscribe:switchTerminal];
[[switchTerminal skip:1] subscribe:modelTerminal];
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With