Objective c 什么是;此类不符合键值编码要求”;什么意思?

Objective c 什么是;此类不符合键值编码要求”;什么意思?,objective-c,cocoa,debugging,runtime-error,Objective C,Cocoa,Debugging,Runtime Error,我正在为MacOSX(第四版)进行Cocoa编程,和其他许多人一样,我也被困在一个挑战中;具体而言,第8章,挑战1。由于无法自己找到解决方案,我从Clay博客的生活中找到了一些帮助。我在那里添加了解决方案,但出现以下错误: 2013-05-09 00:28:49.049 RaiseMan[58078:303] Error setting value for key path sortDescriptors of object <NSArrayController: 0x7fcee2a519

我正在为MacOSX(第四版)进行Cocoa编程,和其他许多人一样,我也被困在一个挑战中;具体而言,第8章,挑战1。由于无法自己找到解决方案,我从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"].
2013-05-09 00:28:49.049 RaiseMan[58078:303]对象[object class:RMPerson,所选对象的数量:1](来自绑定对象):[valueForUndefinedKey:]:该类与键[personName valueForKeyPath:@“length]的键值编码不兼容。
问题是,在试图找出问题所在的过程中,我看到StackOverflow上到处都出现了这个错误,我还没有弄清楚它试图传达关于我的项目的什么信息。我无法找到解决方案之间的任何关联来理解此错误消息,因此我无法使用它来了解代码中发生了什么

所以,长话短说,我并不是真的在寻找我的代码有什么具体错误的帮助,而是更努力地找出这个错误消息的真正含义,这样我就可以自己找出问题所在;然而,这是我无论如何要做的。如果你不仅能告诉我哪里出了问题,还能告诉我为什么这个错误适用于我正在做的事情,那就太好了


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

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

在本例中,您试图通过NSMutableArray的键设置其值,这是不可能的

“此类不符合键值编码”是什么意思

没什么

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

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

这意味着该类的对象没有名为
的属性,至少就键值编码而言是这样,因此您不能使用KVC从这些对象获取此类属性的值

绑定是NSArrayController的重要组成部分,它使用KVC获取和设置绑定属性以及您将它们绑定到的属性,因此尝试将某些内容绑定到不存在的属性会导致此异常

不过,你有一个特殊的例子:

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

严格地说,KVC会接受几乎任何没有句点的东西作为键,但实际上,很少有对象会识别任何不是标识符的键,并且所有对象(NSDictionary除外)都希望键至少是单个单词Objective-C消息表达式不是有效的密钥,不能是密钥路径的一部分。

从外观上看,我猜您实际上已将“
[personName valueForKeyPath:@“length”]
”粘贴到nib中的模型键路径字段中,用于阵列控制器的
排序描述符
绑定。那不行。“模型关键路径”字段只需要关键路径本身

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

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

当我使用
personName
作为排序键和
caseInsensitiveCompare:
作为选择器对其进行排序时,一切正常。当我使用
[personName valueForKeyPath:@“length”]
personName.length
作为排序键,使用
compare:
作为选择器时,会出现此错误

选择器并不重要

注意某个东西是需要一个关键路径还是只需要一个关键路径。区别很微妙,但却非常重要。排序描述符需要一个键。

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

乍一看,这可能意味着您尝试使用的对象没有名称为key.Perfect的属性/实例变量。这正是我需要知道的。关于错误消息的解释,以及关于我正在尝试做的事情的信息。顺便说一句,是的,我正试着按照名字的长度来排序。我可以不带那个刺耳的声音吗
…RMPerson …: this class is not key value coding-compliant
for the key [personName valueForKeyPath:@"length"].