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

时间:2013-05-09 04:55:08

标签: objective-c cocoa debugging runtime-error

我正在通过 Cocoa Programming for Mac OS X(第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绑定到File的Owner,employees(NSMutableArray)作为其Model Key Path。 employees是一个RMPerson个对象的数组,每个对象都有两个属性:personName(NSString)和expectedRaise(浮点数)。表格的第一列显示了相应personName的{​​{1}};我试图根据挑战使用RMPerson的长度对第一列进行排序。当我使用personName作为排序键并将personName作为选择器进行排序时,一切都很顺利。当我使用caseInsensitiveCompare:[personName valueForKeyPath:@"length"]作为排序键并使用personName.length作为选择器时,会出现此错误。

3 个答案:

答案 0 :(得分:1)

  

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

没有

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

  

“此类不符合<key>的键值编码”是什么意思?

这意味着该类的对象没有名为<key>的属性,至少就键值编码而言,因此您无法使用KVC从此类属性获取值它们。

绑定,其中NSArrayController是一个至关重要的部分,使用KVC来获取和设置绑定属性以及绑定它们的属性,因此尝试将某些内容绑定到不存在的属性将获得此异常

你有一个特例,但是:

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

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

严格地说,KVC几乎可以接受任何没有句号的关键字,但实际上,很少有对象识别出任何不是标识符的关键字,并且 all 他们(NSDictionary除外)期望键至少是单个单词。 Objective-C邮件表达式不是有效密钥,也不能成为密钥路径的一部分。

我猜你实际上已经将“[personName valueForKeyPath:@"length"]”粘贴到你的nib中的Model Key Path字段中 - 对于数组控制器的sortDescriptors绑定,从它的外观来看。那不行。模型密钥路径字段单独使用密钥路径本身。

personName.length将是一个有效的密钥路径,但假设你的RMPersons的名字是字符串,那不会得到一个排序描述符数组,所以你可以期待数组控制器阻塞一系列数字。

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

  

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

选择器并不重要。

注意事物是否需要关键路径或只是一个关键 - 区别是微妙的,但非常重要。排序描述符需要一个密钥。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

所以,如果你发现这个&#34; Class不符合编码价值&#34;您的项目中没有一些IBOutlet变量名称的奇怪错误,请尝试删除应用程序并在Simulator上重新安装它。 为我工作!

相关问题