我有一个UIButton,其状态正常/突出显示的标题应该与其容器对象的属性保持同步。
如何使用字符串属性绑定特定状态的按钮标题?
修改:
我知道使用RACObserve并更改subcribeNext块中的按钮标题是一种解决方案 我正在寻找更专门为UIButton设计的东西,如:
RACBindButtonTitle(button, property, state1, state2);
我不知道是否有一些" RAC糖"像这样。
答案 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