1

嗨,我一直在谷歌搜索,但找不到答案,也许有不同的方法可以做到这一点,所以我把它交给社区。

我在 UIViewController 中有一个表格视图。UIViewController 是表视图的数据源和委托。然后我有第二个控制器,它对主 UIViewController 中的滚动做出反应。理想情况下,我希望第二个控制器也成为委托,以便 scrollviewDidBeginScrolling 将在两个控制器中触发。我想这样做是因为它使控制器 2 很容易实现,因为您将它设置为委托并传入 tableview 引用,它会完成所有繁重的工作。

基本上你可以将一组代表传递给 tableView.delegate 吗?我可以看到一些情况,您希望多个控制器或视图对像 scrollViewDidBeginScrolling 这样的事件做出反应。有什么方法可以完成类似的事情而不必做类似的事情

-(void)scrollViewDidBeginScrolling:(UIScrollView *)scrollView{
     [anotherViewController scrollviewDidScroll:scrollview];
     [otherView scrollViewDidScroll:scrollview];
}

我将它用于控制器,而不是处理表视图的拉动刷新,我希望在表视图控制器中使用尽可能少的行/方法使实现尽可能简单。

4

3 回答 3

2

你可以完成你需要的,但你需要链接代表。表格视图将只有一个委托,但您可以在作为表格视图委托的视图控制器中定义自己的自定义委托方法,并将您的另一个视图控制器设置为该委托。另一种蛮力方法是只发送通知并让视图控制器注册通知。

于 2012-12-04T18:03:41.460 回答
1

在您的 UIViewController1 委托方法中,只需将相同的调用发送到 UIViewController2 委托方法。EI:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   [delegate2 tableView:tableView didSelectRowAtIndexPath:indexPath];
   // etc...

编辑下面的评论。您可以继承 UITableView 并为其提供多个委托属性或委托属性数组。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
   for(id delegate in _delegates)
       [delegate tableView:tableView didSelectRowAtIndexPath:indexPath];
   // Do nothing else, because the delegates handle everything.
}
于 2012-12-04T18:05:43.343 回答
0

您需要的是委托多路复用。我写了一个类来做到这一点:https ://github.com/aleph7/MultiDelegate

于 2013-03-19T17:16:40.210 回答