所以我有这个BaseCell
类,也有这个BaseCellViewModel
。当然,除此之外,还有一些FancyViewController
和FancyViewModel
。这里的情况是BaseCell
上带有UIButton
,它触发了这个IBAction
方法-很好,这很酷,因为我可以在其中做任何我想做的事,但是...我不知道如何让FacyViewController
知道有关的事实动作发生在BaseCell
上。
我可以在RACObserve
中对属性进行FancViewModel
,因为它具有那些单元格视图模型的NSArray
,但是如何监视实际动作并通知有关在单元格上触发的确切动作的信息?
我想到的第一件事是委托或通知,但是由于我们的项目中有 RAC ,所以完全不使用它是愚蠢的,对吧?
[编辑]我到目前为止所做的...
因此,事实证明,您可以使用RACCommand
实际处理特定按钮上的UI事件。在这种情况下,我添加了:
@property (strong, nonatomic) RACCommand *showAction;
用简单的实现到我的
BaseCellViewModel
:- (RACCommand *)showAction {
return [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
NSLog(@"TEST");
return [[RACSignal empty] logAll];
}];
}
按照这种模式,我不得不在
BaseCell
中做一些事情,结果变得非常简单,最后我添加了:- (void)configureWithViewModel:(JDLBasePostCellViewModel *)viewModel {
self.viewModel = viewModel;
self.actionButton.rac_command = self.viewModel.showAction;
}
还有... ,可以! 但是...
每当发生这种情况时,我都需要提供
UIActionSheet
,并且只有当我需要当前的parentViewController
时才能显示此信息,并且由于我没有将此类信息传递到任何地方,所以我现在不知道该怎么办。FancyViewModel
拥有一个私有的@property (nonatomic, strong) NSMutableArray <BaseCellViewModel *> *cellViewModels;
,但是如何在FancyViewController
上注册一些内容以实际侦听以便在RACCommand
上执行BaseCellViewModel
? 最佳答案
单元可以通过几种方式与视图控制器通信。常见的做法是通过委派。让单元声明一个公共委托,例如:
// BaseCell.h
@protocol BaseCellDelegate;
@interface BaseCell : UITableViewCell
@property(nonatomic, weak) id<BaseCellDelegate> delegate;
// ...
@end
@protocol BaseCellDelegate <NSObject>
- (void)baseCell:(BaseCell *)cell didReceiveAction:(NSString *)actionName;
@end
按下按钮后,计算出您想告诉委托人的内容,然后告诉它:
// BaseCell.m
- (IBAction)buttonWasPressed:(id)sender {
self.delegate baseCell:self didReceiveAction:@"someAction";
}
然后,在视图控制器中,声明您符合协议:
// FancyViewController.m
@interface FancyViewController () <BaseCellDelegate>
在
cellForRowAtIndexPath
中,设置单元格的委托:// dequeue, etc
cell.delegate = self;
现在,您将需要在vc中实现此功能:
- (void)baseCell:(BaseCell *)cell didReceiveAction:(NSString *)actionName {
// the cell got an action, but at what index path?
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
// now we can look up our model at self.model[indexPath.row]
}