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

时间:2011-07-12 20:19:41

标签: iphone uitableview

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

如果cell==nil,那么我正在使用[id_array objectAtIndex:indexPath.row]获取ID并从服务器获取有关该行的更多信息,并设置单元格的标签和图像。

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

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

任何人都知道为什么会这样? 谢谢!

编辑:这是我的cellForRowAtIndexPath方法

- (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;
}

1 个答案:

答案 0 :(得分:3)

如果您仅在cell==nil设置数据,那么这就是您的问题。 UITable构建表视图单元格的缓存,如果单元格为零,则仅创建一个新缓存。因此,必须每次都设置数据,即cell==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;
}