【问题标题】:What does "this class is not key value coding-compliant" mean?“这个类不符合键值编码”是什么意思?
【发布时间】:2016-12-30 21:04:35
【问题描述】:

我正在完成Mac OS X 的Cocoa 编程(第4 版),并且和许多其他人一样,我遇到了挑战;具体来说,第 8 章,挑战 1。我自己无法找到解决方案,我从 Life as Clay 博客中找到了一些帮助。我在那里添加了解决方案,但出现以下错误:

2013-05-09 00:28:49.049 RaiseMan[58078:303] Error setting value for key path sortDescriptors of object <NSArrayController: 0x7fcee2a51900>[object class: RMPerson, number of selected objects: 1] (from bound object <NSTableView: 0x7fcee2a48750>): [<RMPerson 0x7fcee1c5c870> valueForUndefinedKey:]: this class is not key value coding-compliant for the key [personName valueForKeyPath:@"length"].

问题是,在试图找出问题所在时,我已经看到 StackOverflow 上到处出现这个错误,我还没有辨别出它试图传达的关于我的项目的哪些信息。我找不到解决方案之间的任何关联来理解此错误消息,因此我无法使用它来弄清楚我的代码中发生了什么。

所以,长话短说,我并不是真的在寻求关于我的代码有什么特别错误的帮助,而是更多地试图找出这个错误消息的实际含义,这样我就可以自己找出问题所在;但是,这就是我正在尝试做的事情。如果您不仅可以告诉我出了什么问题,还可以告诉我为什么这个错误适用于我正在做的事情,那就太好了。

在这个特定的例子中,我有一个绑定到 ArrayController 的 TableView。 ArrayController 绑定到文件的所有者,employees(一个 NSMutableArray)作为它的模型键路径。 employees 是一个 RMPerson 对象数组,每个对象都有两个属性:personName(一个 NSString)和expectedRaise(一个浮点数)。表格的第一列显示来自各自RMPersonpersonName;我正在尝试根据挑战使用personName 的长度对第一列进行排序。当我使用personName 作为排序键并使用caseInsensitiveCompare: 作为选择器对其进行排序时,一切都很好。当我使用[personName valueForKeyPath:@"length"]personName.length 作为排序键并使用compare: 作为选择器时,会出现此错误。

【问题讨论】:

  • 乍一看,这可能意味着您尝试使用的对象setValue:forKey: 没有以名称为键的属性/实例变量。

标签: objective-c cocoa debugging runtime-error


【解决方案1】:

“这个类不符合键值编码”是什么意思?

什么都没有。

完整的异常消息使问题更有意义:

“此类不符合 &lt;key&gt; 的键值编码”是什么意思?

这意味着该类的对象没有名为&lt;key&gt; 的属性,至少就键值编码而言,因此您不能使用KVC 从它们那里获取此类属性的值。

Bindings,其中 NSArrayController 是一个重要的部分,它使用 KVC 来获取和设置绑定属性和你绑定它们的属性,所以尝试将一些东西绑定到一个不存在的属性会得到这个异常.

不过,你有一个特殊情况:

…RMPerson …: this class is not key value coding-compliant
for the key [personName valueForKeyPath:@"length"].

这意味着您尝试使用“[personName valueForKeyPath:@"length"]”作为键

严格来说,KVC 将接受几乎所有没有句点的键作为键,但在实践中,很少有对象识别任何不是标识符的键,并且全部 其中(NSDictionary 除外)希望键至少是单个单词。 Objective-C 消息表达式不是有效的键,不能成为键路径的一部分。

我猜你实际上将“[personName valueForKeyPath:@"length"]”粘贴到了 nib 中的 Model Key Path 字段中——从外观上看是数组控制器的 sortDescriptors 绑定。那是行不通的。 Model Key Path 字段需要单独的密钥路径。

personName.length 将是一个有效的键路径,但假设您的 RMPersons 的名称是字符串,这不会为您提供一个排序描述符数组,因此您可以预期数组控制器会阻塞数字。

无论你想做什么(按名字的长度排序?),你都应该问另一个问题。

当我使用personName 作为排序键并使用caseInsensitiveCompare: 作为选择器对其进行排序时,一切都很好。当我使用[personName valueForKeyPath:@"length"]personName.length 作为排序键并使用compare: 作为选择器时,会出现此错误。

选择器并不重要。

注意某些东西是否需要一个键路径或只是一个键 - 区别很微妙,但对应用程序来说非常重要。排序描述符需要一个键。

【讨论】:

  • 完美。这正是我需要知道的。既是关于错误消息的解释,也是奇迹般地关于我正在尝试做的事情的信息。顺便说一句,是的,我正在尝试按名称的长度排序。
  • 可以不做恶作剧
【解决方案2】:

这意味着您试图通过它的键访问/设置对象的值,但它没有任何键值对。

在你的情况下,你试图通过它的键设置 NSMutableArray 的值,这是不可能的。

【讨论】:

    【解决方案3】:

    因此,如果您发现此“类未编码值兼容”奇怪错误,并且您的项目中不存在某些 IBOutlet 变量名称,请尝试删除应用程序并在模拟器上重新安装它。 为我工作!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多