2

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

  • UITableView 数据源
  • UIScrollViewDelegate

我的应用程序中的许多地方都使用了这个表格视图。我已经在后台实现了图像下载。当用户滚动时,会下载额外的图像——这就是我需要实现 UIScrollViewDelegate 方法的原因。我绝对希望在这个类中而不是在视图控制器中拥有它,因为这些自定义表视图中的每一个都使用相同的方法实现。

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

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

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

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

4

2 回答 2

0

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

你不可以。UITableView是一种看法。它不应该与网络对话。那是模型(或者可能是模型控制器)的功能。您正在讨论的功能与显示信息无关。它与获取信息有关。

您想要的是将滚动视图委托方法转换为自定义UITableViewController并从中继承您的其他表视图控制器。但是,实际下载应由您的模型管理。你的视图控制器应该观察模型并随着它的变化而更新。

于 2013-01-19T18:02:10.380 回答
0

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

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

self.bookTableView 在我看来是 UITableView 。

要从此子 TVC 执行转场,您可以使用以下命令:

[self.parentViewController performSegueWithIdentifier:@"Book Details" sender:selectedBook];
于 2013-01-20T13:05:21.243 回答