objective-c - "this class is not key value coding-compliant"是什么意思?

标签 objective-c cocoa debugging runtime-error

我正在努力学习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 上发现了这个错误,但我还没有弄清楚它试图传达有关我的项目的哪些信息。我找不到解决方案之间的任何关联来理解此错误消息,因此我无法使用它来弄清楚我的代码中发生了什么。

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

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

最佳答案

What does “this class is not key value coding-compliant” mean?

什么都没有。

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

What does “this class is not key value coding-compliant for <key>” mean?

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

绑定(bind)(NSArrayController 是其中的重要组成部分)使用 KVC 来获取和设置绑定(bind)属性以及将它们绑定(bind)到的属性,因此尝试将某些内容绑定(bind)到不存在的属性将会出现此异常.

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

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

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

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

我猜你实际上粘贴了“[personName valueForKeyPath:@"length"] ” 到 Nib 中的“模型 key 路径”字段中 — 对于阵列 Controller 的 sortDescriptors从表面上看,具有约束力。那是行不通的。模型关键路径字段需要单独的关键路径本身。

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

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

When I sort it using personName as the sort key and caseInsensitiveCompare: as the selector, all is well. This error crops up when I use either [personName valueForKeyPath:@"length"] or personName.length as the sort key and compare: as the selector.

选择器并不重要。

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

关于objective-c - "this class is not key value coding-compliant"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16454644/

相关文章:

objective-c - 使用 initWithRect :[self bounds] and [self frame] 初始化时,NSTrackingArea 会产生不同的结果

ios - 如何等待 findObjectsInBackgroundWithBlock(在 Parse 中)完成然后运行 ​​MainThread?

objective-c - 挂载前判断网络共享是否存在

debugging - 使用 Webstorm 8 调试 sails 应用程序时“Step Over”不起作用

php - 将任何数组转换为文本表

ios - 如何从 NSDictionary 中删除作为 NSDictionary 元素的条目?

ios - 必须为标识符注册一个 nib 或一个类或连接一个原型(prototype)单元

iphone - 在提高性能的获取请求模板下发生了什么?

objective-c - 从不同的类调用时无法访问 NSMutableArray 的内容

c++ - 如何通过具有命令行参数的 procdump 启动 Windows 应用程序?