检查特定的UITableViewCell是否在UITableView中可见

27
我有一个UITableView和一些UITableViewCells,我通过Interface Builder手动创建了这些单元格。我为每个单元格分配了一个outlet,并在CellForRowAtIndexPath方法中将它们连接到UITableView上。在这个方法中,我使用switch(case)方法根据情况使特定的单元格出现在UITableView中。

现在,我想要查找一个特定的单元格,并检查它是否存在于UITableView中。我使用方法:UITableView.visibleCells来获取表视图中的单元格数组。我的问题是 - 如何检查这个特定的单元格是否存在于数组中?我可以以某种方式使用分配给它的outlet吗? - (最好的解决方案)还是我可以使用标识符,如何使用?

谢谢:)

5个回答

77

请注意你也可以这样使用 indexPathsForVisibleRows:

    NSUInteger index = [_people indexOfObject:person];
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
    if ([self.tableView.indexPathsForVisibleRows containsObject:indexPath]) {
      [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
                            withRowAnimation:UITableViewRowAnimationFade];
    }

如果您有indexPath(且不需要实际的单元格),这可能会更加便宜

PS:_people是在此情况下用作我的后端的NSArray


3
大多数情况下,这个解决方案比被接受的解决方案更好。 - Envil

19
if ([tableView.visibleCells containsObject:myCell])
{
    // Do your thing
}
这假定你有一个单独的实例变量包含你感兴趣的单元格,我认为你从问题中得到了它,但不是很清楚。

谢谢,这是另一种实现Sorig给我的解决方案的方法 :) - ozking
如果单元格可见,这就是原始问题的正确答案。感谢您提供干净简洁的答案。 - Martin Schultz

11
你可以使用UITableView方法:
[tableView indexPathForCell:aCell];

如果单元格在tableView中不存在,则返回nil。否则您将得到单元格的NSIndexPath。


1
你可以在Swift中这样做,以检查UITableViewCell是否可见:
let indexPathToVerify = IndexPath(row: 0, section: 0)
let cell = tableView.cellForRow(at: indexPathToVerify)

if tableView.visibleCells.contains(cell) {
    // the cell is visible
}

1
自从iOS 7以来,indexPathForVisibleRows将包含一个位于半透明导航栏下方的行,因此现在您需要执行以下操作:
[self.tableView indexPathsForRowsInRect:self.tableView.safeAreaLayoutGuide.layoutFrame]

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