如何解决“NSUnknownKeyException”错误...setValue:forUndefinedKey:]: ...not key value coding compliant?

35
好的,我会尽可能地简要说明。我想在我的键盘上方添加一个UIToolbar,这花了我一些时间才弄明白,最终我成功了,但是当我尝试为按钮添加功能“previous”、“next”和“done”时,我的程序很快就无法编译。
整个错误消息可以在此处查看:

2012-06-20 05:36:55.276 KegCop[79460:fb03] * 应用程序因未捕获的异常 'NSUnknownKeyException' 而终止,原因是:'[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key done.'

* 首个抛出的调用栈: (0x134a022 0x1733cd6 0x1349ee1 0xd31022 0xca2f6b 0xca2edb 0xcbdd50 0x5a571a 0x134bdea 0x12b57f1 0x5a426e 0x7adeef 0x7ae03e 0x382d7a 0x382ff8 0x38217f 0x391183 0x391c38 0x385634 0x1f84ef5 0x131e195 0x1282ff2 0x12818da 0x1280d84 0x1280c9b 0x381c65 0x383626 0x2a8d 0x29f5 0x1) 终止时抛出异常(lldb)

@Abizern建议我阅读键值编码指南的Apple文档。无论如何,现在已经很晚了,或者说很早了,取决于你如何看待它。更新的项目可以在这里找到:https://github.com/ipatch/KegCop
只需下载zip文件,尝试构建,你就会明白我在说什么。错误可能出现在ViewControllerWelcome.m文件中。

启用异常断点。这样可以找出问题代码所在的位置。你不能期望别人下载、构建和修复整个项目的错误。在某个地方,你使用了“done”作为方法名或键,但在你的类中没有对应的内容。我建议先查看界面生成器中连接的操作。 - jrturton
6个回答

71

查看你的故事板或xib文件(无论你用哪个),找到ViewControllerWelcome对象。这个错误最有可能的原因是,某个东西连接到了一个在该类代码中不存在的操作或输出口,名字叫做done


5
是的,这就是答案。很可能您在Viecontroller中连接了某些已从.h和.m文件中删除的内容。 - Nithin M Keloth
是的,这就是我的原因。谢谢你。 - Gibberish
帮助我找到了问题。我已经重命名了一个属性,这是一个出口,并需要更新故事板以匹配。 - Chuck Krutsinger
@Phillip Mills,你能否请看一下这个关于NS[whatever]UsageDescription键的其他问题?https://stackoverflow.com/q/53710674/4124574。我相信你在这里的苹果开发者论坛上发布了类似的内容(https://forums.developer.apple.com/message/196093#196093),我真的需要一个正确方向的指针。 - Mig82
这也帮助了我,再加上Xcode在这个终止错误的上一行中说“Interface Builder文件中未知的MyCustomViewController类”。我意识到我没有为自定义类指定“模块”!哎呀! - jannamcl

36

检查的最简单方法是在Storyboard视图中Ctrl+单击您的Controller,然后查找结果弹出窗口中带有黄色警告标记的内容。 只需按下Outlet名称旁边的(X)按钮即可将其删除。


4
如果您正在使用故事板,请单击每个视图控制器并选择它们的连接检查器。检查是否存在任何感叹号(表示丢失连接)。
正确删除它们,然后重新运行您的项目。

0
在我的情况下,这是由于 Xcode 中一些奇怪的缓存问题,即使删除了所有对 IBOutlets 的引用,仍然导致程序崩溃。IBOutlets 指向了旧版本的文件,因此甚至删除并重新添加文件或从 nib 中删除所有引用出口也不起作用...
解决方案:关闭 Xcode 可以解决问题,此外清理/深度清理项目可能也有帮助。

请确保您的属性输出位于@interface与类名中或其超类中。 - user2387149

0

我遇到了同样的问题,我使用了一个 xib 来管理视图控制器,但后来我将其删除了。然而在代码中,连接依然在获取已删除 xib 中的连接。所以解决方法是为视图控制器创建一个新的 xib。这样问题就得以解决。


-2

对于我的情况,我在“其他链接器标志”中添加了-all_load以防止Xcode剥离我的库二进制代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接