1

在通过 cellForRowAtIndexPath 大约九次之后,我的代码跳过了 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;
}
4

1 回答 1

0

克莱夫滑雪,

那是因为您正在重用 tableview 单元格,dequeueReusableCellWithIdentifier这在 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;
于 2010-07-12T19:29:08.830 回答