当单元格不可见时,UITableView indexPathForCell 返回 null

Posted

技术标签:

【中文标题】当单元格不可见时,UITableView indexPathForCell 返回 null【英文标题】:UITableView indexPathForCell return null when cell is not visible 【发布时间】:2014-09-08 19:54:17 【问题描述】:

我有一个 UITableView,其中有很多高行(一次只能在屏幕上显示 2-3 行),当特定视图添加到 UITableViewCell 层次结构时,还有一些代码可以以编程方式滚动到特定行。如果目标行在屏幕上可见,indexPathForCell 返回正确的 NSIndexPath。如果用户必须向下滚动才能看到目标行,则返回的 NSIndexPath 为空。

代码如下:

-(void)scrollToLastSelection 
    if ((firstLabel) && (secondLabel))                 
        UITableViewCell *targetCell = [self getTableViewCellFromSubview:secondLabel];
        NSIndexPath *targetCellIndexPath = [myTableView indexPathForCell:targetCell];
        CGRect targetCellRect = [myTableView rectForRowAtIndexPath:targetCellIndexPath];

        NSLog(@"------ secondLabelCell: %@", targetCell);
        NSLog(@"------ secondIndexPath: %@", targetCellIndexPath);            

        [myTableView scrollToRowAtIndexPath:targetCellIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
    


- (UITableViewCell *) getTableViewCellFromSubview:(UIView*)subview 
    UITableViewCell* tableViewCell = nil;    
    while (subview.superview != Nil) 
        if ([subview.superview isKindOfClass:[UITableViewCell class]]) 
            tableViewCell = (UITableViewCell*)subview.superview;
            break;
         else 
            subview = subview.superview;
        
        
    return tableViewCell;

这是 NSLog 的输出:

------ secondLabelCell: <UITableViewCell: 0x947c8f0; frame = (0 120; 320 10); hidden = YES; autoresize = W; layer = <CALayer: 0x947ca80>>
------ secondIndexPath: (null)

有谁知道获取隐藏的 UITableCell 的正确 NSIndexPath 的方法吗?或者滚动到隐藏的 UITableViewCell?

提前致谢!

更新:我在一些测试中发现,如果我滚动到(或过去)目标单元格(因此它会在某个点呈现在屏幕上),并且从原始位置(所以目标单元格再次离开屏幕),以下工作(感谢@Deepan):

UITableViewCell *targetCell = [self getTableViewCellFromSubview:secondLabel];
NSIndexPath *indexPathFromCellCenter = [self.myTableView indexPathForRowAtPoint:targetCell.center];
[myTableView scrollToRowAtIndexPath:indexPathFromCellCenter atScrollPosition:UITableViewScrollPositionTop animated:NO];

还有其他想法吗?

【问题讨论】:

【参考方案1】:

您的问题似乎与以下问题类似,根据接受的答案,您可以考虑使用 indexPathForRowAtPoint 方法来获取索引。

tableView:indexPathForCell returns nil

【讨论】:

感谢您的及时回复,但是,这并没有解决问题。它没有返回null,而是返回0、0的索引路径:NSIndexPath *indexPathFromCellCenter = [myTableView indexPathForRowAtPoint:targetCell.center]; NSLog(@"------ indexPathFromCellCenter: %@", indexPathFromCellCenter); Produced:------ indexPathFromCellCenter: &lt;NSIndexPath: 0x94e80b0&gt; length = 2, path = 0 - 0

以上是关于当单元格不可见时,UITableView indexPathForCell 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 UITableView,静态单元格不可见

iOS Swift UICollectionView 照片浏览 - 当单元格不可见时如何停止取消 DispatchQueue

UITableView 单元格不显示正确的详细信息

完全可见时在 UITableView 中播放视频

UITableView 单元格内容未正确显示

向下滚动时,UITableview 看不到最后一个单元格