我在viewcontroller中有一个tableview,tableview的数据源是单独的类,这是通知viewcontroller添加/删除某些数据以便它可以向数据添加/删除行的最佳方法吗?
我有一个想法是使用代表,但它会是这样的 从webservice到Datasource的回调 - > 从数据源到viewcontroller的fire delegate方法
这让我觉得我做错了什么,求助!
答案 0 :(得分:1)
您可以在其他类(具有数据源的类)中创建弱属性以保持对视图控制器的引用:
@property (nonatomic, weak) MyViewController *viewController;
当你添加/删除行时,只需在视图控制器上调用适当的方法,如下所示:
//删除行
[self.viewController deleteRowAtIndexPath:indexPath];
当然,您必须将此方法添加到视图控制器。
您需要做的最后一步是将视图控制器与您的其他类连接。 在视图控制器中,您在设置表视图委托的位置执行类似的操作:
tableView.delegate = otherClass; //<- this is the class you store table view delegate.
otherClass.viewController = self;
请注意,这只是您可以执行此操作的一种方式,另一种方法可以是委托(如上所述)或阻止,通知等。
//扩展
使用阻止你必须这样做。 在其他班.h:
// create typedef to avoid typing all block definition
typedef void (^CompleteBlock) (NSIndexPath *indexPath);
//Declare property
@property (nonatomic, copy) CompleteBlock removeRowCompleteBlock;
// in .m file call block where you remove row:
if (self. removeRowCompleteBlock)
self. removeRowCompleteBlock(indexPath);
在创建其他类的实例后,在视图控制器文件中添加删除行块:
tableView.delegate = otherClass; //<- this is the class you store table view delegate.
otherClass.removeRowCompleteBlock = ^(NSIndexPath *indexPath) {
// od something
NSLog(@"Row removed: %@", indexPath);
};