UITableViewDataSource和UIViewController之间的通信

时间:2014-07-15 11:39:24

标签: ios objective-c uitableview uiviewcontroller

我在viewcontroller中有一个tableview,tableview的数据源是单独的类,这是通知viewcontroller添加/删除某些数据以便它可以向数据添加/删除行的最佳方法吗?

我有一个想法是使用代表,但它会是这样的 从webservice到Datasource的回调 - > 从数据源到viewcontroller的fire delegate方法

这让我觉得我做错了什么,求助!

1 个答案:

答案 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);
};