UITableView滚动事件

52

我想检测我的表格视图是否已经滚动过,我尝试了所有的触摸事件,像这样:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  {
    [super touchesBegan:touches withEvent:event];
    //my code
  }

但似乎所有触摸事件都不响应滚动,只有在触摸、移动单元格等操作时才响应。

有没有一种方法可以检测UITableView的滚动事件?


2
参考这篇文章 iPhone中UIScrollView的触摸事件 - Ravi Kumar Karunanithi
3个回答

135
如果你实现了 UITableViewDelegate 协议,那么你也可以实现其中一个UIScrollViewDelegate 方法。
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
或者
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
例如,如果你有一个名为tableView的属性:
// ... setting up the table view here ...
self.tableView.delegate = self;
// ...

// Somewhere in your implementation file:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    NSLog(@"Will begin dragging");
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@"Did Scroll");
}

这是因为UITableViewDelegate遵循UIScrollViewDelegate,可以在文档或头文件中看到。


1
当我们有多个UITableView时怎么办? - Solidus
1
你应该能够将两个表视图的委托设置为“self”,然后使用传递的“scrollView”检查哪一个被滚动。在这里查看 - fabian789

9

以下是使用 Swift 来检测 UITableView 将要滚动或已经滚动的 UITableViewDelegate 方法:

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {

}

func scrollViewDidScroll(_ scrollView: UIScrollView) {

}

8
如果你有多个表视图,如Solidus所要求的,你可以将回调中的scrollview转换为tableview,因为UITableView继承自UIScrollView,然后与tableviews进行比较以找到源tableview。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {    
        UITableView* fromTableView = (UITableView*) scrollView;
        UITableView* targetTableView = nil;
        if (fromTableView == self.leftTable) {
            targetTableView = self.leftTable;
        } else {
            targetTableView = self.rightTable;
        }
...
}

1
完美,这对我很有帮助。 - Paul
1
一个小提示:为了让 == 比较工作,你不必进行强制转换。 - Arik Segal

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