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
当我处理表格视图单元格时,遇到了相同的错误日志。我发现我的UILabels有重复的引用出口(您可以在参考检查器中检查它),分别指向文件所有者和我的单元格类。当我删除对文件所有者的引用时,问题得到解决。

0

如果你试图观察一个不存在的值,一定要注意。

这种情况曾经发生在我身上,当时我本应该观察“text”属性,但却错误地观察了文本字段的“Text”属性。


0
我的问题的原因是我复制了一个故事板文件(如果我没记错的话是在 Xcode 之外),然后所有在复制文件中的视图控制器都具有与原始文件中相同的对象 ID。解决方法是复制粘贴视图控制器,它们将获得新的对象 ID。您可以在“身份检查器”中查看对象 ID。

0

我正在使用Xamarin.IOS创建自定义nib。最终我找到了根本原因,进入Xcode并选择nib文件,在Interface Builder中选择UIView类并选择Connections Inspector,然后删除如下所示的默认输出口。enter image description here


0
在我的情况下,我已经将一个ViewController添加到了故事板中,但是我没有在设计师中为它分配一个Storyboard ID。一旦我给它分配了一个ID,它就可以工作了。
使用Xamarin/Visual Studio 2015。

0

enter image description here

通过单击按钮并重新创建对该按钮的引用来删除按钮引用。


0

我在这个线程中尝试了每一个选项,唯一能解决问题的是更改自定义视图xib文件的名称。

我的自定义视图和xib文件同名。重命名xib文件解决了问题。


0

这个线程真的是一个史诗般的传奇,就像@FranticRock所说的那样。

在我的情况下 -

  1. 插座已正确连接
  2. "从目标继承"具有适当的值,这意味着模块已经被正确添加

在我这种情况下导致崩溃的原因是身份检查器下的用户定义的运行时属性

我有一个视图,它以某种方式具有三个属性:borderColor,borderWidth和cornerRadius

enter image description here

从该视图中删除这些属性解决了问题。

0
就我而言,我愚蠢地将我的UIViewController的访问修饰符更改为私有的,当然它无法访问它...

0
如果您想在Interface Builder中的单独XIB文件中设计一个小的子视图,并且在IB中将其设置为与父视图相同的类,则此问题也会发生。
如果您像这样显示它:
UIViewController *vc = [[UIViewController alloc] initWithNibName:@"NameOfTheSubviewNibFile" bundle:nil];
[self.view addSubview:vc.view];

视图将会出现,但是如果它有连接到File Owner的IBOutlets,你将会得到错误信息。所以,以下方法会起作用:

  1. 在父视图的代码中,声明一个IBOutlet UIView *mySubview来引用子视图的nib文件中的视图
  2. 在子视图的nib文件中,将File Owner连接到视图,并将其设置为mySubview
  3. 通过执行以下代码来显示:
[[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil]
[self.view addSubview:mySubview];

这样就可以了!


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