1

我有一个包含 1 个部分和许多行的表。每个单元格都包含一些标签,所以我想获取它们的文本。我的问题是,使用下面的代码,我在获得前 5 个单元格后无法获得单元格。我知道这很奇怪。需要明确的是,如果我有 20 行,我只能使用下面的代码获得 5 个单元格,其余 15 个为空。但是 for 循环变为 20,前 5 个单元格没问题,但其余的是空的..

所有行都相同,因此没有空单元格。我的错误是什么?

        NSIndexPath  *indexPath;
        ReportTableCell *cell;

        for (int i = 0; i < [_tableReport numberOfRowsInSection:0] ; i++)
        {
            indexPath = [NSIndexPath indexPathForRow:i inSection:0];

            cell = (ReportTableCell *)[_tableReport cellForRowAtIndexPath:indexPath];
        }
4

2 回答 2

1

这是因为表格视图不会在内存中保留屏幕外的单元格。这是减少内存使用和加速滚动的优化。

文档中:

cellForRowAtIndexPath:

返回值
表示表格单元格的对象,如果单元格不可见或 indexPath 超出范围,则返回 nil。

您只能访问当前实际可见的单元格。

于 2013-05-17T11:33:25.237 回答
1

UITableView 将单元​​格排队以供重用。这意味着如果您有 100 行,则不能保证它会创建 100 个单元格。通常它只会创建可见的单元格,然后再将它们重新用于要显示的其余项目。这是以某种方式实现的,如下所示:

static NSString *MyCellIdentifier = @"MyCellIdentifier"; 
UITableViewCell* cell = [tv dequeueReusableCellWithIdentifier:MyCellIdentifier];
//dequeueReusableCellWithIdentifier will give you the cells that has been added to queue after scroll and are ready for re-use.
if(cell == nil){
   // create new.
}

所以从技术上讲,你不能得到所有的细胞。在您说出您尝试完成的确切目的之前,可能会应用替代方案。

于 2013-05-17T11:35:22.420 回答