【问题标题】:UITableViewCell error - this class is not key value coding-compliant for the key [duplicate]UITableViewCell 错误-此类不符合键的键值编码[重复]
【发布时间】:2012-08-31 12:09:19
【问题描述】:

当我尝试通过 UINib 的 instantiateWithOwner 方法从 xib 文件加载自定义 UITableViewCell 时出现以下错误。我已经尝试了在这里可以找到的所有其他解决方案,但都没有运气。问题似乎是当 UINib 打开 xib 文件时,它使用超类 UITableViewCell 而不是我的自定义类 ContentPackCell。我附上了一个来自 Interface Builder 的屏幕截图,显示了我将 xib 与我的类关联的位置以及关联标识符的位置。必须有一些其他的步骤,我错过了。

错误:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UITableViewCell 0x6b87220> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key descriptionLabel.'

代码(类似于 Apple 的示例 AdvancedTableViewCells 项目):

ContentPackCell *cell = (ContentPackCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    [self.cellNib instantiateWithOwner:self options:nil];
    cell = tmpCell;
    self.tmpCell = nil;
}


更新:

【问题讨论】:

  • 我已经准备好放弃这一点,回到使用 NSBundle 的 loadNibNamed 方法的旧方法。它似乎对我的情况很好。
  • 我发现如果我右键单击我的自定义单元格标签并拖动到适当的 .h 文件,以创建一个出口,出口被分配给文件的所有者,这会导致上述崩溃。相反,如果我右键单击标签并拖动到表格单元格(向左),然后选择适当的插座,一切正常。
  • @softwareevolved 同意这看起来是一个更好的答案。我没有回去尝试过,但我确实投票结束了我的问题,因为我的问题与那个问题重复。谢谢!

标签: iphone objective-c ios cocoa-touch cocoa-bindings


【解决方案1】:

确保 nib 中的 File's Owner 设置为 NSObject,并确保没有连接到 File's Owner 的插座。

【讨论】:

  • 在经历了很多相关问题之后,这就是解决我的问题的一个。
  • 也为我解决了。谢谢
  • 我确认。 IBOutlets 损坏是问题所在。
  • 是的,必须为单元格指定自定义类,而不是为文件所有者指定。之后,做插座参考。
【解决方案2】:

检查 nib 中的所有元素,确保它们没有引用不再存在的东西。右键单击它们以查看指向什么。里面肯定会有东西。

【讨论】:

  • 我不这么认为。问题在于指向现有 IBOutlet、descriptionLabel 的链接。问题似乎是 instantiateWithOwner 使用 UITableViewCell 而不是我的自定义类。由于 UITableViewCell 中没有 descriptionLabel 的 IBOutlet,所以炸了。如果我删除与自定义类的 descriptionLabel 的连接,它不会崩溃,但它也没有必要的连接。
【解决方案3】:

看起来您已将 nib 中的 UILabel 与代码中不再存在的 IBOutlet 相关联(descriptionLabel)。

所以再次检查您的 nib 文件。我也多次遇到此错误,这就是我的解决方案。

【讨论】:

  • 不,请参阅我对 SimonH 回答的评论。
【解决方案4】:

我遇到了完全相同的错误,我想知道为什么当我右键单击左侧“对象”中的表格单元格时,我的 .h 文件中的 IBOutlets 没有显示,而只是在文件所有者处显示。我发现,当我在 xib 文件的“视图”中左键单击自定义表格单元格,然后在属性检查器中将其分配给“标识符”处的正确自定义 (tableViewCell) 类时,出口出现在表格单元格中在“对象”。也许这有帮助!

【讨论】:

    【解决方案5】:

    在我的情况下,问题是通过检查可编译源列表中是否存在 .m 来解决的。

    如果您为自定义表格单元格(或 Interface Builder 所需的任何其他内容)重命名、移动或添加新源,您应该将它们添加到 Project -> Targets -> -> Build Phases -> Compile Sources。

    如果您有多个目标 - 检查所有目标。在我的项目中,有一个聚合类型的活动目标(使用自定义 IPA 构建脚本),我认为这是问题的根源,因为新添加的 *.m 文件缺少应用程序类型目标的编译源列表。

    【讨论】:

    • 感谢您的评论。由于某种原因,XCode 未能将我的一个自定义单元格的 .m 文件添加到构建目标中,即使它通常在我添加新类时也是如此。这为我解决了这个问题。我可能不会想到将其视为潜在原因。
    【解决方案6】:
    static NSString *CellIdentifier = @"CellIdentifierName";
    ContentPackCell *cell = (ContentPackCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    
    if (cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"ContentPackCell" owner:self options:nil] ;
        cell=objCustomCell;
    }
    

    【讨论】:

    • 我正在尝试以新的、更有效的方式重用 UINib 实例。所以,我不想使用 loadNibNamed。我想使用 instantiateWithOwner。
    【解决方案7】:

    你有没有这样尝试过,

    ContentPackCell *cell = (ContentPackCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
      [self.cellNib instantiateWithOwner:nil options:nil]; //Make owner nil
      cell = tmpCell;
      self.tmpCell = nil;
    }
    

    通常当您执行[[NSBundle mainBundle] loadNibNamed:@"ContentPackCell" owner:nil options:nil]; 时,您会得到与现在一样的错误。因此,如果您收到诸如“此类不符合键值编码”之类的错误,在这两种情况下,原因都是没有为自定义单元格的“文件所有者”设置类。

    【讨论】:

    • 是的,当我尝试这种方式时,我得到了同样的错误,所以我认为你正在做一些事情——谢谢。不幸的是,我仔细检查了,该类是为单元格的文件所有者设置的。我用显示此内容的屏幕截图更新了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 2012-11-27
    • 1970-01-01
    • 2019-06-23
    • 2012-04-26
    • 2017-10-24
    • 2017-12-23
    相关资源
    最近更新 更多