【问题标题】:Repeated TableViewCells show up when I try to reuse tableviewcells... how do I get the new ones to show?当我尝试重用 tableviewcells 时会出现重复的 TableViewCells...如何让新的 TableViewCells 显示?
【发布时间】:2010-07-12 19:08:46
【问题描述】:

在通过 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;
}

【问题讨论】:

    标签: iphone scroll reusability tableviewcell


    【解决方案1】:

    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;
    

    【讨论】:

    • 哇!非常感谢!就是这样!但是,现在当我运行它并向下滚动时,出现此错误: 2010-07-12 15:48:05.753 TabTabTab[25374:20b] *** -[UICGColor isEqualToString:]: unrecognized selector sent to instance 0x3d9edc0 2010- 07-12 15:48:05.755 TabTabTab[25374:20b] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*** -[UICGColor isEqualToString:]:无法识别的选择器发送到实例 0x3d9edc0”有什么想法吗? ?
    • 没关系!我删除了发布线,一切顺利!非常感谢你的帮助。我真的很感激
    • 没问题,但请参阅我更新的帖子。您不能只删除 release 行,否则您将泄漏这些对象,因为它们永远不会被释放。相反,只需摆脱它们,因为无论如何您都不需要它们(请参阅我的代码)。也请点击旁边的“复选框”将此问题标记为已回答
    • 谢谢 - 我更新了我的代码。我没有看到表明问题已得到回答的愚蠢复选框
    • 它位于每个“答案”顶部附近的向上/向下投票箭头。它只是作为一种(奇怪的)奖励系统来帮助回答问题的人。祝你好运
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多