在UITableView中实现UIScrollViewDelegate方法

时间:2013-01-19 17:50:07

标签: iphone ios objective-c xcode

我正在使用符合这些协议的自定义UITableView:

  • UITableViewDataSource
  • UIScrollViewDelegate

此表格视图用于我的应用中的许多地方。我已经在后台实现了图像下载。当用户滚动时,会下载其他图像 - 这就是我需要实现UIScrollViewDelegate方法的原因。我肯定希望在这个类中而不是在视图控制器中使用它,因为每个自定义表视图都使用相同的方法实现。

这是问题所在。在我的视图控制器中,我需要从UITableViewDelegate实现didSelectRowAtIndexPath方法,因为我需要执行一个segue。但是当我这样做(并将委托设置为self)时,UIScrollViewDelegate方法被此视图控制器捕获,并且不会传播到表视图,因为UITableView扩展了UIScrollView(以及他的委托方法)。

我通过将其添加到我的每个视图控制器中来“解决”它:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    [self.bookTableView scrollViewDidEndDragging:scrollView willDecelerate:decelerate];
}

但是在整个应用程序的许多地方都有相同的代码块(仅供参考,其中只有一个,还有一些)并不是很好。你有什么想法我能解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

  

我绝对希望在这个类中而不是在视图控制器中使用它,因为每个自定义表视图都使用相同的方法实现。

不,你没有。 UITableView是一种观点。它永远不应该与网络通信。这是模型的功能(或可能是模型控制器)。您正在讨论的功能与显示信息无关。它与获取信息有关。

你想要的是滚动视图委托方法到自定义UITableViewController并从中子类化你的其他表视图控制器。但是,实际下载应由您的模型管理。您的视图控制器应观察模型并在更改时进行更新。

答案 1 :(得分:0)

我已经通过使用iOS 6中的新功能 - 嵌入式视图控制器解决了这个问题。在每个视图控制器中,我正在使用此表视图控制器,我执行此操作:

self.tableViewController.tableView = self.bookTableView;
[self addChildViewController:self.tableViewController];

其中self.bookTableView是我视图中的UITableView。

要从这个孩子TVC执行segue,您可以使用:

[self.parentViewController performSegueWithIdentifier:@"Book Details" sender:selectedBook];