滚动后检测UITableView中的当前顶部单元格

che*_*ewy 38 iphone cocoa-touch objective-c uitableview ipad

一个简单的问题,但我似乎没有正确的术语来搜索Stackoverflow.

我有一个没有部分的UITableView,用户可以向上和向下滚动此tableview中显示的一长串数据(行).

问题:如何在用户滚动后检测到最顶部的单元格行号.(例如,如果用户向下滚动30个单元格,则滚动后的顶部单元格= 30)

phi*_*phi 71

你可以尝试使用UITableView's -indexPathsForVisibleRows-indexPathForRowAtPoint.

例如,假设您要停止拖动表格时打印最顶层可见单元格的indexPath.你可以这样做:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    NSIndexPath *firstVisibleIndexPath = [[self.tableView indexPathsForVisibleRows] objectAtIndex:0];
    NSLog(@"first visible cell's section: %i, row: %i", firstVisibleIndexPath.section, firstVisibleIndexPath.row);
}
Run Code Online (Sandbox Code Playgroud)

对于Swift 3.0

let topVisibleIndexPath:IndexPath = self.tableView.indexPathsForVisibleRows![0]
Run Code Online (Sandbox Code Playgroud)

  • 我会对数组进行排序,因为文档中没有任何内容(据我所知),索引路径按升序排序. (4认同)
  • 请注意,`[self.tableView indexPathsForVisibleRows]`可能为空,当用户滚动表格视图时启用弹跳,就像小鸡一样.所以一定要检查方法是否返回了至少1个索引路径. (2认同)

jba*_*100 31

您将获得可见行的索引路径

NSArray* indexPaths = [tableView indexPathsForVisibleRows];
Run Code Online (Sandbox Code Playgroud)

然后使用排序 compare:

NSArray* sortedIndexPaths = [indexPaths sortedArrayUsingSelector:@selector(compare:)];
Run Code Online (Sandbox Code Playgroud)

然后获取第一个元素的行

NSInteger row = [(NSIndexPath*)[sortedIndexPaths objectAtIndex:0] row];
Run Code Online (Sandbox Code Playgroud)


mat*_*ema 8

这是Swift 3+代码:

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    let firstVisibleIndexPath = self.tableView.indexPathsForVisibleRows?[0]
    print("First visible cell section=\(firstVisibleIndexPath?.section), and row=\(firstVisibleIndexPath?.row)")
}
Run Code Online (Sandbox Code Playgroud)