Objective c 使用ReactiveCocoa根据NSSet对象计数启用按钮

Objective c 使用ReactiveCocoa根据NSSet对象计数启用按钮,objective-c,reactive-cocoa,Objective C,Reactive Cocoa,我尝试使用ReactiveCocoa启用按钮,具体取决于NSMutableSet实例中的对象数是否大于零 我正在使用以下代码,但在运行时遇到崩溃。有什么想法吗 RAC(self.navigationItem.leftBarButtonItem, enabled) = [RACSignal combineLatest:@[self.selectedRows] reduce:^(NSMutableSet *set){ return @([set count] > 0); }]; “N

我尝试使用ReactiveCocoa启用按钮,具体取决于NSMutableSet实例中的对象数是否大于零

我正在使用以下代码,但在运行时遇到崩溃。有什么想法吗

RAC(self.navigationItem.leftBarButtonItem, enabled) = [RACSignal combineLatest:@[self.selectedRows] reduce:^(NSMutableSet *set){
    return @([set count] > 0);
}];

“NSInvalidArgumentException”,原因:“-[\uu NSSetM map::]:无法识别的选择器发送到实例0x9671d10”

您需要将
selectedRows
属性转换为信号:

RAC(self.navigationItem.leftBarButtonItem, enabled) = [RACSignal combineLatest:@[RACAbleWithStart(self.selectedRows)] reduce:^(NSMutableSet *set){
    return @([set count] > 0);
}];

您需要将
selectedRows
属性转换为信号:

RAC(self.navigationItem.leftBarButtonItem, enabled) = [RACSignal combineLatest:@[RACAbleWithStart(self.selectedRows)] reduce:^(NSMutableSet *set){
    return @([set count] > 0);
}];

得知NSarry、NSMUTABLEARRY不支持KVO,这让人很难过。在做类似的事情时

但幸运的是,UIViewController是兼容KVO的

//create a readonly property selectionCount
@property (nonatomic, readonly)NSInteger selectionCount;
...

//Implement the getter method
-(NSInteger)selectionCount{
    return self.arrSelection.count;
}
...

RAC(self.btnConfirm, enabled) = [RACSignal combineLatest:@[RACAbleWithStart(self.selectionCount)] reduce:^(NSNumber *count){
        return @([count integerValue] > 0);
    }];

得知NSarry、NSMUTABLEARRY不支持KVO,这让人很难过。在做类似的事情时

但幸运的是,UIViewController是兼容KVO的

//create a readonly property selectionCount
@property (nonatomic, readonly)NSInteger selectionCount;
...

//Implement the getter method
-(NSInteger)selectionCount{
    return self.arrSelection.count;
}
...

RAC(self.btnConfirm, enabled) = [RACSignal combineLatest:@[RACAbleWithStart(self.selectionCount)] reduce:^(NSNumber *count){
        return @([count integerValue] > 0);
    }];

当您
+combinelatetest:
时,数组是一个信号数组,而不是键路径。当您
+combinelatetest:
时,数组是一个信号数组,而不是键路径。此外,根本不需要
+combinelatetest:reduce:
。它可以用
-map:
来编写。谢谢,这让我通过了崩溃,但在将对象添加到
self.selectedRows
时,似乎没有启用按钮。提供一点上下文-这是一个删除按钮,当表格视图中的行高亮显示时应启用该按钮,当未选择任何内容时应禁用该按钮。@Alexander集合必须是,因为
RACAble
只是美化了KVO。如果您正在就地修改集合(而不是替换它),则不会自动生成必要的通知。如果您将更改包装到
selectedRows
,并使用
[self-willChangeValueForKey:@“selectedRows”]
[self-didChangeValueForKey:@“selectedRows”]
将上述代码完美地工作,这根本不需要
+combineTest:reduce:
。它可以用
-map:
来编写。谢谢,这让我通过了崩溃,但在将对象添加到
self.selectedRows
时,似乎没有启用按钮。提供一点上下文-这是一个删除按钮,当表格视图中的行高亮显示时应启用该按钮,当未选择任何内容时应禁用该按钮。@Alexander集合必须是,因为
RACAble
只是美化了KVO。如果您正在就地修改集合(而不是替换它),则不会自动生成必要的通知。如果您使用
[self-willChangeValueForKey:@“selectedRows”]
[self-didChangeValueForKey:@“selectedRows”]包装对
selectedRows的更改,则上述代码将非常有效。