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

ReactiveCocoa: How do you bind a button's title to a text property?

我有一个 UIButton,其状态 normal/highlighted 的标题应该与其容器 object 的 属性 保持同步。

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

编辑:

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

RACBindButtonTitle(button, property, state1, state2);

不知道有没有这样的"RAC sugar"

如果您的意思是它们与一个 属性 同步,则如下所示:

[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];
}];

这是一种无需显式订阅即可完成的方法。 应尽可能避免显式订阅,这样您就不必经历整个 @weakify(self) @strongify(self) 舞蹈。

[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];

liftSelector:withSignals: 将急切地订阅它的信号,这与许多其他 RAC 功能不同。

请参考这个gist

你不能直接在 UIButton 上使用 RAC() 因为 the UIKit design:

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