从笔尖加载的 UITableViewCell 未更新(缓存?)

Posted

技术标签:

【中文标题】从笔尖加载的 UITableViewCell 未更新(缓存?)【英文标题】:UITableViewCell loaded from nib not updated (cached?) 【发布时间】:2014-04-10 10:01:27 【问题描述】:

我使用 Core Data 和 MagicalRecord 来管理items,可以启用禁用。有 数据存储中 Item 实体上的 enabled 标志。 item 也有一个title。最后我 使用NSFetchedResultsController 在表格视图中显示items。表视图有两个 部分:第一个用于启用的项目,第二个用于禁用的项目。所有项目 默认情况下启用禁用项的单元格具有不同的背景颜色(黄色)。 更复杂一点的是,单元格是从一个 nib 文件中加载的,如下所示:

  - (void)viewDidLoad
  
      // ...

      self.items = [Item fetchAllGroupedBy:@"enabled"
                             withPredicate:nil
                                  sortedBy:@"enabled,createdOn"
                                 ascending:NO
                                  delegate:self];
      // ...

      [self.tableView registerNib:[UINib nibWithNibName:@"CustomTableViewCell" bundle:nil]
           forCellReuseIdentifier:@"CustomCellReuseIdentifier"];

      // ...
  

  // ...

  - (CustomTableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  
      static NSString     *reuseIdentifier = @"CustomCellReuseIdentifier";
      CustomTableViewCell *cell            =
          (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:reuseIdentifier
                                                                 forIndexPath:indexPath];

      [self configureCell:cell forRowAtIndexPath:indexPath];

      return cell;
  

  - (void)configureCell:(CustomTableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
  
      Item *item = [self.items objectAtIndexPath:indexPath];

      cell.titleLabel.text = item.title;

      if (!item.enabled.boolValue) 
          cell.backgroundColor = [UIColor colorWithRed:0.999 green:0.895 blue:0.452 alpha:1.000];
      
  

  // ...

现在,当我禁用一个item删除它,然后创建一个新的item 同名, 新 item 的单元格 具有黄色背景,即使新 item启用。如果我检查 item 本身,它确实启用,所以它只是保持黄色的单元格。

请问有谁知道问题出在哪里?

【问题讨论】:

【参考方案1】:

这是一个常见的错误。

您正在使一个可重复使用的单元出队。它将处于添加到队列(或缓存,如果您愿意)时的任何状态。

您需要在configureCell: 方法中添加else 代码块:

- (void)configureCell:(CustomTableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

    Item *item = [self.items objectAtIndexPath:indexPath];

    cell.titleLabel.text = item.title;

    if (!item.enabled.boolValue) 
        cell.backgroundColor = [UIColor colorWithRed:0.999 green:0.895 blue:0.452 alpha:1.000];
    
    else
    
        // Set cell.backgroundColor to the enabled color
    

【讨论】:

啊!我犯的愚蠢错误......非常感谢!还不能接受答案,你发的太快了!【参考方案2】:

您需要设置默认背景颜色。 发生这种情况是因为出列单元格后,背景颜色不会自动设置。 所以就这样吧:

cell.backgroundColor = [UIColor whiteColor]; //put here default color of your cell
if (!item.enabled.boolValue) 
          cell.backgroundColor = [UIColor colorWithRed:0.999 green:0.895 blue:0.452 alpha:1.000];

【讨论】:

以上是关于从笔尖加载的 UITableViewCell 未更新(缓存?)的主要内容,如果未能解决你的问题,请参考以下文章

使用多个笔尖在 UITableViewCell 中动态获取行高

来自笔尖的自定义 UiTableViewCell 没有重用?

如何从笔尖实例化 UITableViewCell

从笔尖初始化自定义 UITableViewCell 没有 dequeueReusableCellWithIdentifier

在运行时重新加载自定义 UITableViewCell 的 Nib

iOS:笔尖中的 TableView - 设置背景颜色