使用ReactiveCocoa禁用UIBarButtonItem

时间:2015-07-07 14:25:05

标签: ios objective-c mvvm reactive-cocoa

我正在尝试在满足条件时在我的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方法内手动将布尔值设置为falsethresholdLimitReachedSignal - 按钮仍保持启用状态!

如果我手动订阅thresholdLimitReachedSignal 像这样:

[self.viewModel.thresholdLimitReachedSignal subscribeNext:^(id x) {
    self.requestNewPinButton.enabled = NO;
}];

然后按钮被禁用没问题。我希望将这个信号与requestSignal结合起来 - 我认为initWithEnabled:signalBlock这样做了吗?

1 个答案:

答案 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:...];