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