2

我正在通过Cocoa Programming for Mac OS X (4th Edition)努力工作,并且像许多其他人一样,我遇到了挑战;具体来说,第 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(an NSMutableArray) 作为其模型键路径。employees是一个RMPerson对象数组,每个对象都有两个属性:(personName一个 NSString)和expectedRaise(一个浮点数)。表格的第一列显示personName了各自的RMPerson; 我正在尝试根据personName挑战使用长度对第一列进行排序。当我使用personName排序键和caseInsensitiveCompare:选择器对其进行排序时,一切都很好。当我使用[personName valueForKeyPath:@"length"]orpersonName.length作为排序键和compare:选择器时,会出现此错误。

4

3 回答 3

1

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

没有什么。

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

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

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

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

但是,您有一个特殊情况:

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

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

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

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

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

无论您要做什么(按名称的长度排序?),您都应该对此提出另一个问题。

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

选择器并不重要。

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

于 2013-05-09T06:11:01.453 回答
0

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

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

于 2013-05-09T05:02:01.387 回答
0

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

于 2016-12-30T13:04:35.637 回答