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
我有一个 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