我正在尝试在满足条件时在我的iOS应用中禁用UIBarButtonItem
。
所以在viewModel
我创建了这个信号:
-(RACSignal *)thresholdLimitReachedSignal
{
@weakify(self);
return [RACObserve(self, thresholdLimitReached) filter:^BOOL(id value) {
@strongify(self);
return self.thresholdLimitReached;
}];
}
然后在我viewController
我有这个:
self.requestNewPinButton.rac_command = [[RACCommand alloc]initWithEnabled:self.viewModel.thresholdLimitReachedSignal
signalBlock:^RACSignal *(id input) {
[self.viewModel.requestNewPinSignal subscribeNext:^(id x) {
//do some stuff here
}];
return [RACSignal empty];
}];
因此UIBarButtonItem
被触发并触发requestNewPinSignal
,效果很好。然后我标记thresholdLimitReached
导致thresholdLimitReachedSignal触发 - 一切都很好。然而,按钮不会被禁用,我不知道为什么?无论我是否在true
方法内手动将布尔值设置为false
或thresholdLimitReachedSignal
- 按钮仍保持启用状态!
如果我手动订阅thresholdLimitReachedSignal
像这样:
[self.viewModel.thresholdLimitReachedSignal subscribeNext:^(id x) {
self.requestNewPinButton.enabled = NO;
}];
然后按钮被禁用没问题。我希望将这个信号与requestSignal结合起来 - 我认为initWithEnabled:signalBlock
这样做了吗?
答案 0 :(得分:2)
[RACObserve(self, thresholdLimitReached) filter:^BOOL(id value) {
@strongify(self);
return self.thresholdLimitReached;
}];
您正在过滤thresholdLimitReachedSignal
以便它只返回YES
,因此您的按钮始终会被启用。对于初学者,您可以像这样重写并避免使用@weakify
/ @strongify
:
[RACObserve(self, thresholdLimitReached) filter:^BOOL(NSNumber *thresholdLimitReached) {
return thresholdLimitReached.boolValue;
}];
但是不要这样做:如果你使用它作为启用信号,它需要是一个布尔信号,当它应该被启用时发送YES
而它应该NO
被禁用。
假设您希望在达到阈值时禁用该按钮,则需要以下内容:
[[RACCommand alloc] initWithEnabled:[RACObserve(self.viewModel, thresholdLimitReached) not]
signalBlock:...];