ReactiveCocoa:如何将按钮的标题绑定到文本属性?

时间:2015-05-06 01:29:08

标签: ios reactive-cocoa

我有一个UIButton,其状态正常/突出显示的标题应该与其容器对象的属性保持同步。

如何使用字符串属性绑定特定状态的按钮标题?

修改

我知道使用RACObserve并更改subcribeNext块中的按钮标题是一种解决方案 我正在寻找更专门为UIButton设计的东西,如:

RACBindButtonTitle(button, property, state1, state2);

我不知道是否有一些" RAC糖"像这样。

3 个答案:

答案 0 :(得分:6)

在没有明确订阅的情况下,这是一种方法。 应尽可能避免明确订阅,这样您就不必经历整个PositiveSmallIntegerField @weakify(self)舞蹈。

@strongify(self)
与许多其他RAC功能不同,

[self.button rac_liftSelector:@selector(setTitle:forState:) withSignals: RACObserve(self, normalButtonTitle), [RACSignal return:@(UIControlStateNormal)], nil]; [self.button rac_liftSelector:@selector(setTitle:forState:) withSignals: RACObserve(self, selectedButtonTitle), [RACSignal return:@(UIControlStateSelected)], nil]; 将热切地订阅其信号。

答案 1 :(得分:1)

如果你的意思是他们与一个属性同步,那就是:

[RACAble(self.buttonTitle) subscribeNext:^(NSString *newTitle) {
    NSString *normalTitle = [NSString stringWithFormat:@"Normal %@", newTitle];
    NSString *highlightedTitle = [NSString stringWithFormat:@"Highlighted %@", newTitle];
    [self.button setTitle:normalTitle forState:UIControlStateNormal];
    [self.button setTitle:highlightedTitle forState:UIControlStateHighlighted];
}];

如果你的意思是两个属性,就像这样:

[RACAble(self.normalButtonTitle) subscribeNext:^(NSString *newTitle) {
    [self.button setTitle:newTitle forState:UIControlStateNormal];
}];

[RACAble(self.highlightedButtonTitle) subscribeNext:^(NSString *newTitle) {
    [self.button setTitle:newTitle forState:UIControlStateHighlighted];
}];

答案 2 :(得分:0)

请参阅此gist

由于the UIKit design,您无法直接在UIButton上使用RAC()

RAC(self.button.titleLabel, text) = titleSignal;  // Don't do this.

其中一个解决方案是使用动态属性来支持RAC()绑定宏:

// .h
@interface UIButton (RACTitleSupport)
@property (strong, nonatomic) NSString *racExt_Title;
@end

// .m
@implementation UIButton (RACTitleSupport)
@dynamic racExt_Title;
- (void)setRacExt_Title:(NSString *)racExt_Title
{
  [self setTitle:racExt_Title forState:UIControlStateNormal];
}
- (NSString *)racExt_Title
{
  return [self titleForState:UIControlStateNormal];
}
@end

现在您可以像这样使用RAC()绑定宏:

RAC(self, button.racExt_Title) = titleSignal;

干杯< 3