我正在通过 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
作为选择器时,会出现此错误。
答案 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上重新安装它。 为我工作!