【问题标题】:Communication between UITableViewDataSource and UIViewControllerUITableViewDataSource 和 UIViewController 之间的通信
【发布时间】:2014-07-15 11:39:23
【问题描述】:

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

我的一个想法是使用委托,但它会像 从 web 服务回调到数据源 --> 从数据源触发委托方法到视图控制器

这让我觉得我做错了什么,救命!!

【问题讨论】:

标签: ios objective-c uitableview uiviewcontroller


【解决方案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);
};

【讨论】:

  • 谢谢,但它不会创建循环引用吗?
  • 这就是为什么你使用弱而不是强 - 以避免循环引用。
  • 哦,是的,但实际上我想让数据源类不那么耦合
  • 弱引用避免了保留循环,但它确实创建了一个逻辑循环引用,它将视图控制器和数据源在两个方向上耦合,如果可能的话我会避免。在这种情况下使用单独的委托对我来说很有意义。
  • 但是这样会有两个委托,一个会返回实际数据,一个只会通知视图控制器更新 UI,可以吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2017-08-13
  • 2013-10-18
  • 2011-08-08
相关资源
最近更新 更多