Iphone 由于某种原因,UITableView正在加载相同的单元格

Iphone 由于某种原因,UITableView正在加载相同的单元格,iphone,uitableview,Iphone,Uitableview,我有一个TableView,加载一个自定义单元格,并从服务器上的JSON字符串加载数据。 JSON字符串被解析为一个包含14个id的数组(id_数组) 如果cell==nil,那么我将使用[id\u array objectAtIndex:indexath.row]从服务器获取该行的id和更多信息,并设置单元格的标签和图像 运行应用程序时,UITableView正在加载可见行[0,1,2,3,4](单元格高度为70px)。 向下滚动TableView时,会加载第[5]行并从服务器获取数据,但问题

我有一个TableView,加载一个自定义单元格,并从服务器上的JSON字符串加载数据。 JSON字符串被解析为一个包含14个id的数组(id_数组)

如果
cell==nil
,那么我将使用
[id\u array objectAtIndex:indexath.row]
从服务器获取该行的id和更多信息,并设置单元格的标签和图像

运行应用程序时,UITableView正在加载可见行[0,1,2,3,4](单元格高度为70px)。 向下滚动TableView时,会加载第[5]行并从服务器获取数据,但问题是,超出该点后,TableView会重复这6行,而不是从服务器请求新行的新数据

但它确实为第[5]行请求新数据,当应用程序首次运行时,该行不可见(且未加载)

有人知道为什么会这样吗? 谢谢

编辑:这是我的cellforrowatinexpath方法

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{       
    static NSString *CellIdentifier = @"CustomCell";
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];

        for (id currentObject in topLevelObjects) {
            if ([currentObject isKindOfClass:[UITableViewCell class]]) {
                cell = (CustomCell *)currentObject;

                NSString *appsURL = [NSString stringWithFormat:@"http://myAPI.com?id=%@",[app_ids objectAtIndex:indexPath.row]];
                NSLog(@"row -> %d | id -> %@",indexPath.row,[app_ids objectAtIndex:indexPath.row]);
                NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:appsURL]];
                [cell updateAppInfoForCellWithRequest:request];

                break;
            }
        }
    }

    // Configure the cell...

    return cell;
}

如果您仅在
单元格==nil
时设置数据,那么这就是您的问题。UITable构建表视图单元格的缓存,只有当单元格为nil时才创建新的缓存。因此,每次都必须设置数据,即在
单元格==nil
块之外

下面的示例显示了该过程。首先,从池中抓取一个单元格,如果没有空闲单元格,则创建一个新单元格。设置相应行的单元格值

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    id someData = [id_array objectAtIndex:indexPath.row]

    cell.textLabel.text = [someData someString];

    return cell;
}

如果您仅在
单元格==nil
时设置数据,那么这就是您的问题。UITable构建表视图单元格的缓存,只有当单元格为nil时才创建新的缓存。因此,每次都必须设置数据,即在
单元格==nil
块之外

下面的示例显示了该过程。首先,从池中抓取一个单元格,如果没有空闲单元格,则创建一个新单元格。设置相应行的单元格值

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    id someData = [id_array objectAtIndex:indexPath.row]

    cell.textLabel.text = [someData someString];

    return cell;
}

如果你改进了以前一些问题的“接受答案”,你就更有可能得到帮助。你应该发布整个cellForRow方法。同意HighlyCaffined,对花时间帮助你的人表示更多尊重。完全同意,我已经重复了我以前的问题,并标记了解决问题的人。对此很抱歉。如果你改进了之前一些问题的“接受”答案,你就更有可能得到帮助。你应该发布整个cellForRow方法。同意HighlyCaffinated,对花时间帮助你的人表示更多尊重。完全同意,我已经重复了我以前的问题,并标记了那些解决问题的人。很抱歉。谢谢你的回复,顺便说一句,我已经在问题中添加了我的方法。我尝试了你的建议,但是它会导致加载到单元格中的数据出现一些奇怪的问题。如果我向下滚动,顶部的单元格会突然显示不同的数据,直到它们被重新加载。显示的错误数据实际上是一个重复使用的单元格,然后从服务器更新。如果我清空标签和图像,那么它不会显示错误的数据,而是不显示任何内容,然后加载。我想做的是加载14个单元格,而不是在上下滚动时重新加载它们。。。这有可能吗?谢谢。在这种情况下,控制器应该预加载数据并将其存储在阵列中。单元格数据应根据需要从此缓存阵列中提取。谢谢,Mark。现在,如果单元格是第一次创建,我将其添加到数组中,如果已经存在,则从数组中重用它。因此,如果我向下滚动,它会在新单元格上显示一个活动指示器,但如果我向上滚动,它不会重新加载上面的单元格。这就是我需要的:)谢谢!(现在我只需要再次检查一下我是否正确处理了内存使用情况)谢谢你的回答,顺便说一句,我已经在问题中添加了我的方法。我尝试了你的建议,但它会导致加载到单元格中的数据出现一些奇怪的问题。如果我向下滚动,顶部的单元格会突然显示不同的数据,直到它们被重新加载。显示的错误数据实际上是一个重复使用的单元格,然后从服务器更新。如果我清空标签和图像,那么它不会显示错误的数据,而是不显示任何内容,然后加载。我想做的是加载14个单元格,而不是在上下滚动时重新加载它们。。。这有可能吗?谢谢。在这种情况下,控制器应该预加载数据并将其存储在阵列中。单元格数据应根据需要从此缓存阵列中提取。谢谢,Mark。现在,如果单元格是第一次创建,我将其添加到数组中,如果已经存在,则从数组中重用它。因此,如果我向下滚动,它会在新单元格上显示一个活动指示器,但如果我向上滚动,它不会重新加载上面的单元格。这就是我需要的:)谢谢!(现在我只需要再次检查一下我是否正确处理了内存使用情况)