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个回答

0

NSUnknownKeyException错误

'NSUnknownKeyException', reason: this class is not key value coding-compliant for the key

.xib 文件(例如 TableViewCell.xib)与单元格类(例如 TableViewCell.swift)名称相同时,我遇到了这个错误。

正确的方法是:

TableViewCell.swift -> View.swift <-> View.xib

0
通常当我遇到这种情况时,@TechZen的答案总是解决问题的良方。然而,昨天我却在故事板连接上浪费了很长时间,最终发现问题出在我的代码中。
我有一个自定义视图控制器,在我的故事板中处理各种布局,但其中一个布局需要一个其他布局不使用的特殊标签。因此,我创建了一个子类,如下所示:
@interface MyViewControllerSubclass : MyViewController

然后我在MyViewControllerSubclass.m中添加了一个私有属性:

@interface MyViewController ()
@property (weak, nonatomic) IBOutlet UILabel *crashesApp;
@end

Xcode很高兴地允许我连接这个IBOutlet,但每次视图加载时,应用程序都会崩溃,并显示旧的“对于键'chrashesApp'不符合键值编码”的错误。

解决方案,在回顾中有点半显而易见,就是更改私有类别以使用正确的名称,即子类的名称:

@interface MyViewControllerSubclass ()
@property (weak, nonatomic) IBOutlet UILabel *noMoreCrashing;
@end

0

我记得过去遇到过类似的问题,我通过更改以下行来解决它:

_vicMain = [[UIViewController alloc] initWithNibName:@"vicMainScreen" bundle:nil];

转换为:

#include "vicLogin_iPad.h"       // This is the H file of the class holding the code for
                                 // processing all the IBOUtlets for the Login screen
.
.
.

_vicMain = [[vicLogin_iPad alloc] initWithNibName:@"vicMainScreen" bundle:nil];

请注意,我最初声明UIViewController来初始化我的_vicMain,但在使用弹出窗口后,我意识到两者都使用相同的UIViewController。
解决方法:
1)将您的类(子视图)与执行上述_vicMain的相同模块一起包含,即在我的情况下是“vicLogin_iPad.h”。
2)使用您的自定义构造函数来声明对象(即不使用“xxx = [UIViewController alloc] ...”,而是使用“xxx = [vicLogin_iPad alloc] ...”)。
这样问题就解决了。
希望这可以帮助您,因为错误消息缺乏细节,所以很难定位...
祝好,
Heider Sati

0

另一个棘手的情况:

在IB中将ViewController添加到故事板中,删除其视图并将自定义类设置为“MyViewController”,以便从MyViewController.xib实例化视图。

指定与“MyViewController”相同的Storyboard ID会导致异常。

将Storyboard ID更改为其他名称可以解决此问题。


0

我犯了一个非常愚蠢的错误,所以我决定在这里分享,希望这能帮助像我一样的人。

我的项目中有另一个子模块,并且我用与主模块中另一个类相同的名称命名了一个新类,我的新类没有xib文件(100%由代码编写),但是主模块中的另一个类有xib文件。 我认为Xcode将新类与主模块中的xib文件链接错误了。

这就是崩溃的原因,提示信息如下:

this class is not key value coding-compliant for the key tableView.


0
确保您在 .m 文件中添加自定义类的(即使是空的)实现,例如:
@implementation MySubclass
@end

0

我遇到了一个稍微不同的形式的相同错误:

在界面构建器中,我有一个带有自定义子控制器的导航控制器。这个子控制器的类名设置正确,但是 NIB 名称(选择子控制器,转到属性检查器)设置为错误的文件(基本上是不同目标的文件)。将其重置为正确的文件名解决了问题。


0

你是否忘记连接你的选择器对象?

哈哈,54个答案中没有一个是我的解决方案。真是一个常见的错误。

在我的情况下,是因为我在我的视图控制器上有一个选择器对象,但没有为它设置出口和动作。

当我只是想看看布局效果时,我经常会忘记连接按钮等。但是似乎对于选择器来说,你不能这样做。


0

我发现了另一个可能导致问题的可能性。

当使用错误的xib名称来调用"initWithNibName"方法时,也会导致这种崩溃。

比如你选择改变一个xib文件的名称,然后忘记将在"initWithNibName"方法中使用的名称改成相同的名称。


0

我也遇到过这个问题。我从一个xib文件中复制了一个带有IBOutlet的视图到另一个xib文件中。尽管我已经删除了旧引用并创建了一个新引用,但仍出现了这个错误。

最终我重新启动了Xcode来解决这个问题。


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