从 UITableView pagingEnabled 获取可见单元格

Posted

技术标签:

【中文标题】从 UITableView pagingEnabled 获取可见单元格【英文标题】:Getting visible cell from UITableView pagingEnabled 【发布时间】:2009-06-15 14:44:09 【问题描述】:

我有一个启用 paging 的 UITableView。每个单元格占据表格的查看区域。意思是,每个单元格与表格的高度和宽度相同。我正在使用具有 name 属性的自定义单元格。我想在标签中显示当前(可查看)单元格的名称。这适用于第一个和最后一个单元格,但中间的任何事情都不是那么容易。问题是 cellForRowAtIndexPath 为这些中间单元调用了两次。这是从第一个单元格滚动到最后一个单元格然后返回的样子。当 cellForRowAtIndexPath 触发该行时,我已经按顺序列出了索引:

Row             indexPath.row
 0                   0         //view loads and table appears
 1                  1,2        //user scrolls to second cell. cellForRowAtIndexPath fires twice.  First time indexPath.row is one and second time it is two.  This causes cell two's name to display in the label, rather than cell one.
 2                  2,3
 3                   3
 //user starts scrolling back to first cell
 2                  1,2 
 1                  1,0
 0                   0

我可以设置使用 NSDate 对象来检测我是否在中间行。通过将上一次与当前时间进行比较,我会知道。但是,如果用户在单元格中滚动的速度非常快,那可能就行不通了。还有其他方法吗?

我尝试过使用多种可见单元格属性,但没有奏效。 UITableView 将加载下一个单元格,即使它不可见,也会使其成为可见单元格的一部分。

【问题讨论】:

【参考方案1】:

好吧,如果您从未找到解决方案,或者对于下一个提出此问题的人,我会为您提供您正在寻找的答案。 UITableView 会为您提供您正在寻找的 indexPaths,然后 UITableView 会很乐意为您提供与这些索引路径匹配的单元格:

UITableView *tableView = self.tableView; // Or however you get your table view
NSArray *paths = [tableView indexPathsForVisibleRows];

//  For getting the cells themselves
NSMutableSet *visibleCells = [[NSMutableSet alloc] init];

for (NSIndexPath *path in paths) 
    [visibleCells addObject:[tableView cellForRowAtIndexPath:path]];


// Now visibleCells contains all of the cells you care about.

【讨论】:

唯一的问题是它们没有排序......有没有一种快速简单的方法来对它们进行排序,或者以正确的顺序将它们添加到数组中? 你也可以通过 [tableView visibleCells] 获取可见单元格; 很好的答案..帮助了我很多【参考方案2】:

将 Douglas 示例转换为 Swift:

let tableView = self.tableView // Or however you get your table view
let paths = tableView.indexPathsForVisibleRows

//  For getting the cells themselves
let visibleCells : NSMutableSet = []

for path in paths! 
    visibleCells.addObject(tableView.cellForRowAtIndexPath(path)!)

【讨论】:

【参考方案3】:

与其关注 UITableView 何时请求单元格,不如关注它何时显示单元格,这由委托方法 tableView:willDisplayCell:forRowAtIndexPath 指示。

【讨论】:

willDisplayCell 产生的结果与我发布的结果相同。【参考方案4】:

获取UITableView的可见单元格的简单而优雅的方法,无需使用indexpath值获取可见单元格

NSArray * visibleCells = tableView.visibleCells;
NSLog(@"Total visible Cells: %i", [visibleCells count]);

如果需要indexpath 的可见单元格

NSArray * paths = [tableView indexPathsForVisibleRows];

【讨论】:

【参考方案5】:

Swift 4+

    
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 
        let firstVisibleIndexPath = self.tableView.indexPathsForVisibleRows?[0]
        
        print("top visible cell section  is \([firstVisibleIndexPath!.section])")
    

【讨论】:

【参考方案6】:

获取 UITableView 当前可见单元格索引

let visibleRect = CGRect(origin: tableview.contentOffset, size: tableview.bounds.size)
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let visibleIndexPath = tableview.indexPathForItem(at: visiblePoint)

获取当前显示的 UITableView 单元格索引

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) 
    for cell in yourBableview.visibleCells 
        let indexPath = yourBableview.indexPath(for: cell)
        print(indexPath)
    

【讨论】:

以上是关于从 UITableView pagingEnabled 获取可见单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UITableView iphone 获取 UITableView IndexPath?

从 UITableView 隐藏单元格

从 UITableView 中删除顶部填充

从 UItableview 删除一行时崩溃

从 UITableView 中删除 UITableViewCell

如何从 SearchResultDetailView 返回 UITableView