Objective c uitableview中的表格单元格为空

Objective c uitableview中的表格单元格为空,objective-c,uitableview,Objective C,Uitableview,我有一张一节多行的桌子。每个单元格都包含一些标签,所以我想获取它们的文本。我的问题是,使用下面的代码,我无法在获得前5个单元格后获得单元格。我知道这很奇怪。要明确的是,如果我有20行,我只能得到5个带有下面代码的单元格,其余15行为空。但是for循环为20,前5个单元格正常,但其余单元格为空 所有行都相同,因此没有空单元格。我犯了什么错 NSIndexPath *indexPath; ReportTableCell *cell; for (in

我有一张一节多行的桌子。每个单元格都包含一些标签,所以我想获取它们的文本。我的问题是,使用下面的代码,我无法在获得前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];
        }
nsindepath*indepath;
可报告单元格*单元格;
对于(int i=0;i<[\u表报告行数部分:0];i++)
{
indexPath=[NSIndexPath indexPathForRow:i第0节];
单元格=(ReportTableCell*)[\u tableReport CellForRowatineXpath:indexPath];
}

这是因为表视图没有在内存中保留屏幕外的单元格。这是一个优化,以减少内存使用和加快滚动

从:

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


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

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.
}

所以从技术上讲,你不可能得到所有的细胞。在你说出你想要达到的确切目的之前,你可以使用其他方法

是的,没错。我只能看到5行。那么我怎样才能访问所有的单元格呢?你不能。你为什么要这么做?当细胞可见时,你必须动态创建细胞。我需要合并所有细胞标签文本并创建报告。你的建议是什么?用你的模型。不要像那样从GUI收集数据。通常,视图控制器中会有一组数据对象(可能只是字符串)。当表视图要求数据源(视图控制器)为给定索引创建单元格时,可以使用数组中的正确数据设置单元格。如果您想要一个包含所有数据的报表,那么您的数组中已经有了这些数据。
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.
}