Objective c 单击单元格外的按钮时如何将RAC信号发送到单元格的查看模式

Objective c 单击单元格外的按钮时如何将RAC信号发送到单元格的查看模式,objective-c,iphone,uitableview,racsignal,Objective C,Iphone,Uitableview,Racsignal,我在导航栏上有一个按钮,名为“编辑”。还有一个包含一些内容的UICollectionView节目。 若要单击“编辑”按钮将进入编辑模式,并且按钮的标题已完成,UICollectionView的单元格也应更新。单击“完成”按钮将执行相反的操作 我已经编写了以下代码: 现在,单击“编辑|完成”按钮后,孔集合视图将更新为刷新,因为单元格中有从服务获取的图像,我不会更新它们。我更喜欢通过手机信号来更新图标。但是如何重构代码呢 1.viewController的-无效ViewDidLoad 2.1.vie

我在导航栏上有一个按钮,名为“编辑”。还有一个包含一些内容的UICollectionView节目。 若要单击“编辑”按钮将进入编辑模式,并且按钮的标题已完成,UICollectionView的单元格也应更新。单击“完成”按钮将执行相反的操作

我已经编写了以下代码: 现在,单击“编辑|完成”按钮后,孔集合视图将更新为刷新,因为单元格中有从服务获取的图像,我不会更新它们。我更喜欢通过手机信号来更新图标。但是如何重构代码呢

1.viewController的-无效ViewDidLoad

2.1.viewController的ViewModel属性

2.2.viewController的ViewModel的-IDIT

3.viewController的-UICollectionViewCell*collectionView:UICollectionView*collectionView cellForItemAtIndexPath:NSIndexPath*indexPath

4.单元格的ViewModel的-voidsetDataModel:DataModeldata with isEditModeSignal:RACSignal*isEditModeSignal

5.Cell.m的-voidsetCellViewModel:CellViewModel*viewModel


啊哈,我发现了问题:我使用self.isEditModeSignal=RACObserveself,isEditMode;我应该使用self.isEditModeSignal=RACObserveself,editMode;。这是根本原因。

此代码非常糟糕。您没有按预期的方式使用ReactiveCocoa。 更好的方法是在cellviewmodels和collectionview viewmodels之间进行绑定。根本不需要触发刷新

像这样:

// In cell viewmodel's init method:
RAC(self,isEditMode) = RACObserve(self, collectionViewModel.isEditMode); 
//Bind view stuff to: RACObserve(self,isEditMode)

//In collectionview viewmodel init method:
RAC(self,isEditMode) = [[[self.editButton.rac_command executionSignals] flatten] scanWithStart:@NO reduce:id^(NSNumber * running, id next) {
  return @(![running boolValue]);
}];

//In collectionview
RAC(self.editButton.titleLabel, text) = [RACObserve(self.viewModel, isEditMode) map:(NSString *)^(NSNumber * x) {
  [x boolValue] ? @"Edit" : @"Done";
}];

不使用CombineTest,而是使用if信号。

是的,我不需要观察editButton的按钮单击事件来重新加载数据。嗨,为什么需要在这里展平?如果我没有误解,您的isEditMode代码只有在按下按钮并完成之前才会是“是”。实际上,对于我的要求,点击按钮就可以切换到编辑模式,就这样。然后再进行编辑。根据。executionSignals]Flant]scanWithStart将不会启动。正如@eckesicle提到的,我应该使用if而不是CombineTest。
 @property (nonatomic, assign, getter= isEditMode) BOOL editMode;
  self.isEditModeSignal = RACObserve(self, isEditMode);
  DataModel* item = [self.dataArray objectAtIndex:indexPath.row];
  [cellViewModel setDataModel:item
         withIsEditModeSignal:self.viewModel.isEditModeSignal];
  [Cell setCellViewModel:cellViewModel];
 self.thing1Signal = [[RACSignal combineLatest:@[self.isEditModeSignal,
                                                     other1Signal,
                                                     other2Signal]
                                 reduce:^id(NSNumber *isEditMode,
                                            NSNumber *other1,
                                            NSNumber *other2){
                                     return @(isEditMode.boolValue && other1.boolValue && other2.boolValue);
                                 }];

 self.thing2Signal = [[RACSignal combineLatest:@[self.isEditModeSignal,
                                                     other3Signal,
                                                     other4Signal]
                                 reduce:^id(NSNumber *isEditMode,
                                            NSNumber *other3,
                                            NSNumber *other4){
                                     return @(isEditMode.boolValue && other3.boolValue && other4.boolValue);
                                 }];
 [[[self.viewModel.thing1Signal deliverOnMainThread] takeUntil:self.rac_prepareForReuseSignal]  subscribeNext:^(NSNumber *isHidden) {
  self.icon1.hidden = isHidden.boolValue;
 }];

 [[[self.viewModel.thing2Signal deliverOnMainThread] takeUntil:self.rac_prepareForReuseSignal]  subscribeNext:^(NSNumber *isHidden) {
  self.icon2.hidden = isHidden.boolValue;
 }];
// In cell viewmodel's init method:
RAC(self,isEditMode) = RACObserve(self, collectionViewModel.isEditMode); 
//Bind view stuff to: RACObserve(self,isEditMode)

//In collectionview viewmodel init method:
RAC(self,isEditMode) = [[[self.editButton.rac_command executionSignals] flatten] scanWithStart:@NO reduce:id^(NSNumber * running, id next) {
  return @(![running boolValue]);
}];

//In collectionview
RAC(self.editButton.titleLabel, text) = [RACObserve(self.viewModel, isEditMode) map:(NSString *)^(NSNumber * x) {
  [x boolValue] ? @"Edit" : @"Done";
}];