当我尝试重用tableviewcells时,重复的TableViewCells出现...我如何让新的显示?

时间:2010-07-12 19:08:47

标签: iphone scroll reusability tableviewcell

我的代码在通过cellForRowAtIndexPath进行了大约9次跳过后跳过if(cell == nil)时出现问题。然后我的表中的项目开始重复,并且每九个项目都这样做。当我删除if(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:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];     


    NSString *temp = [[views objectAtIndex:indexPath.row] objectForKey:@"racer"];
    NSString *val = [[views objectAtIndex:indexPath.row] objectForKey:@"pointsScored"];

    // Set up the cell...
    cell.textLabel.text = temp;
    cell.textLabel.font = [UIFont boldSystemFontOfSize:15];
    cell.detailTextLabel.text = val;

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    [temp release];
    [val release];

    }

    return cell;
}

1 个答案:

答案 0 :(得分:0)

KLevSki,

这是因为您通过dequeueReusableCellWithIdentifier重新使用tableview单元格,这在iPhone平台上是一件好事。会发生什么:

1)在if (cell==nil)部分

中创建单元格

2)一旦创建了多个单元格(在你的情况下,其中9个单元格大致基于屏幕上显示的数量),操作系统开始重新使用表格单元格作为一个好的内存管理器而不是创建每行的唯一表格单元格,可能是内存密集型的

3)由于正在重复使用该单元,因此在if (cell==nil)块之后的部分中您需要做的就是更新/更改每个单元的信息。

作为示例...如果您创建的单元格上只有一个图标和一个标签,则每次将单元格滚动到视图中时,您都会将图标和标签更新为适合该图标的任何图像/字符串细胞

对于你的情况:

...

if (cell == nil) {

    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];     

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

}

// update cell
cell.textLabel.text = [[views objectAtIndex:indexPath.row] objectForKey:@"racer"];
cell.textLabel.font = [UIFont boldSystemFontOfSize:15];
cell.detailTextLabel.text = [[views objectAtIndex:indexPath.row] objectForKey:@"pointsScored"];

return cell;