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

时间:2014-09-08 19:54:18

标签: ios uitableview

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

以下是代码:

-(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 个答案:

答案 0 :(得分:1)

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

tableView:indexPathForCell returns nil