为什么UITableView会调用UIScrollView的代理方法?

7
我有一个应用程序,其中我在UIScrollView中放置了一个UIView,而UIView又包含了一个UITableView,因此层次结构如下所示: UIScrollView -> UIView -> UITableView 我的UITableView中的数据已经填充好了。
现在,我的问题是当我滚动UITableView时,UIScrollView的委托方法scrollViewDidEndDecelerating:scrollViewDidEndDragging::会被调用。
我不希望出现这种情况,怎么停止这种行为呢?
请各位帮忙,提前感谢!!!

如果我理解正确,您已经有了2个滚动视图,因为UITable已经坐在一个滚动视图上。这可能会导致问题。 - geminiCoder
不,我已经保持了[parentScroll setScrollEnabled:NO]... 所以那不是问题... - Kanan Vora
好的,在这种情况下,我明白为什么会让人感到困惑了。让我想一想。 - geminiCoder
+1 寻找相同的人,但标签属性对我不起作用。我已经子类化了滚动视图,但当我滚动表格视图时,它总是调用滚动视图的方法。 - Mangesh
2个回答

10

UITableViewDelegate扩展自UIScrollViewDelegate。因此会调用委托方法。

要停止这个过程,您可以在分配tableView时设置 tableView.tag = 1000; 并在UIScrollViewDelegate方法(scrollViewDidEndDecelerating: and scrollViewDidEndDragging::)的开头添加以下内容:

if(scrollView.tag == 1000)
    return;

1
...或者将表视图保留为实例变量并与之比较。 - Nicolas Miari
我使用标签来最小化指针的使用。并不是因为我害怕它们,而是在我看来,利用自动释放池和标签使代码更不容易出现内存泄漏问题。 - George
我使用指针是因为我有一种不合理的恐惧,担心标签可能最终不会是唯一的!在这种情况下很愚蠢,我知道... - Nicolas Miari

3

由于UITableView继承自UIScrollView,因此它显示了UIScrollView的所有属性和行为。如果您不想要这个,那么请执行以下操作。

假设您的页面上有另一个滚动视图。

viewDidLoad或从XIB(如果您的tableview在XIB中),为您的tableview设置一个标签。

代码中:

self.objYourTableView.tag = 101;

然后在滚动视图代理中

- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
  {
       if(!(scrollView.tag == 101))
       {
          // Go for your code to run.
       }
  }

这样一来,如果你的代码被表格视图调用,它就会跳过执行。其他情况下,它会完美地正常工作。希望这能帮到你。


2
不是因为UITableView继承自UIScrollView,而是因为UITableViewController继承自UIViewController,且UITableViewDelegate继承自UIScrollViewDelegate。 - George

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接