Xcode - 如何修复'NSUnknownKeyException'错误,原因:"...此类不符合键值编码的要求,无法为键X进行编码"?

1317
我正在尝试将一个在我的类中创建的UILabel与一个IBOutlet连接起来。
我的应用程序崩溃并显示以下错误:
*** 
Terminating app due to uncaught exception
'NSUnknownKeyException', reason: 
'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]: 
this class is not key value coding-compliant for the key XXX.'

这是什么意思,我该如何修复?

15
Pedrotorres是正确的。 是的,这是正确的。如果您正在进行UITableViewCell,记住在IB中将File's Owner设置为NSObject,并将UITableViewCell的Class设置为您定义的.h类。 - gdm
4
当你遇到这样的问题,而冒犯的键是一个“动作”而不是一个“插座”,那么很可能你有一个“插座”错误地引用了你的“动作”函数名,而不是你的“插座”变量名。 - Alex Yursha
2
你应该注意到错误信息中键的名称(OP 称其为“XXXX”)是你在 nib 文件中命名的某个东西的名称。这应该有助于缩小你的搜索范围。 - kris
我提交了rdar://22105925,要求苹果在构建时更明显地显示这些错误。 :) - jtbandes
1
如何立即解决问题!https://dev59.com/0eo6XIcBkEYKwwoYOR0q#13812660 绝佳的技巧。 - Fattie
显示剩余6条评论
81个回答

8
可能是因为您已重命名或删除了Xib界面中引用的组件。重新引用即可解决问题。

8

我在复制的项目中遇到了这个问题,并通过检查两个地方解决了它:

1- 确保你的.m文件在列表中 -> 项目 - 构建阶段 - 编译源代码
2- 然后,进入Interface Builder(可能只有IB会出现此错误),取消所有属性、标签、图像等的链接,然后重新链接。我发现我已经删除了一个属性,但它仍然在IB中链接。

希望对某些人有帮助。


7
我发现的另一个“不兼容”的问题是,由于某种原因我设法拥有了两个类的副本。我向错误的副本添加键。接口生成器仍然可以看到这些键并让我连接它们,但在运行时,它使用了另一个没有新键的类的副本。为了找到“正确”的副本,我在XCode中使用cmd-click在其他地方的类名上跳转到正确的副本,然后我杀死了未使用的副本(先从未使用的副本中带来我的编辑)。故事的寓意:重复的类文件是不好的。

7

这个错误是其他问题导致的!

以下是我如何解决它的方法。我使用的是xcode 6.1.1版本和swift语言。每次我的应用程序尝试执行segue跳转到下一个屏幕时,就会出现这个错误。以下是我所做的。

  1. 检查按钮是否连接到正确的操作。(虽然这不是问题,但检查一下仍然是好习惯)
  2. 检查按钮是否有任何额外的操作或输出口,这可能是您错误创建的。(虽然这不是问题,但检查一下仍然是好习惯)
  3. 检查日志,确保下一个屏幕中的所有按钮都具有正确的操作,并且如果有任何segue,请确保它们具有唯一的标识符。(这是问题所在)
    • 其中一个segue没有唯一的标识符
    • 其中一个按钮有一个操作和两个我错误创建的输出口。
    • 删除任何额外的输出口,并确保segue到下一个屏幕具有唯一的标识符。

谢谢,


7

在我的情况下,合并后的xib文件中没有缺失的插座。

Shift + Command + K

解决了我的问题。我清理了项目并重新构建。


6
我有相同的症状。根本原因是我的源文件的“目标成员”未设置为正确的目标。我认为这意味着我的类不会被构建并包含在我的应用程序中。
要更正它:
1. 高亮显示您的.m文件。 2. 在右侧窗格中,选择“文件检查器”。 3. 在“目标成员”部分下,确保选中适当的构建目标。
希望这能帮助到某个人。

6
如果您有一个自定义的UIViewController子类,具有导致问题的IBOutlets,则我找到的一组实际上可以消除错误的步骤是:
1. 将类更改为UIViewController。
2. 断开所有插座连接(它们现在都会出现黄色警告三角形)- 只断开有问题的插座可能已经足够了。
3. 执行所有标准步骤 - ↑⌘K,删除Derived Data(,祷告垫,念珠)。
4. 启动应用程序 - 转到有问题的场景。
5. 关闭应用程序,返回Interface Builder,将类更改回您的自定义类名称。
6. 重新连接您的插座。
启动应用程序,这通常会清除关键值合规性问题。

在Storyboard编辑器中复制和粘贴场景时,这个方法是有效的。 - Mizmor

5
在我的情况下,指定了错误的目标module。只需删除module名称并检查Inherit Module from target即可解决问题。

enter image description here


4
在我的情况下,这是因为引用了错误的Nib文件造成的:
BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];

1
当我重命名视图控制器的类并忘记需要同时更改nib名称时,这种情况也发生在我身上。由于nib名称只是一个字符串,所以不会出现编译器错误。 - kris

3
Thread 1: "[<NSObject xxx> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key xxx."

当你遇到以下情况时,可能会出现此错误:

  1. .xib + UITableViewHeaderFooterView

当你使用 UITableView 并显示扩展了 UITableViewHeaderFooterView 的表头/表尾,并连接到 .swift 文件并且

  • 设置了 File's Owner

正确的方法:

  • containerView 设置 Custom Class
检查.xib文件中的插座。其中一些可能会被Xcode用黄色感叹号标记。在这种情况下,只需重新设置即可。

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