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

2
在我的情况下,是因为ViewController.m中IBOutlet的属性名称已更改,但Storyboard中的名称未更改。通过ctrl-drag重新将IBOutlet引入ViewController.m可以解决该问题。我还注意到在XCode中查找这样的“孤立”IBOutlets的方法:(看图片)没有被"孤立"的都有同心圆而不是行号。

"Orphaned" IBOutlets don't have concentric circles in the line number column.


2
我也遇到过这个问题,原因是通过创建一个新的outlet来重命名视图。你可能在storyboard中仍然有旧的连接outlet。
你需要做的是从storyboard中删除旧的outlet。
步骤如下:
  1. 进入storyboard。
  2. 点击“显示代码审查”按钮(即带有<- ->标志的按钮,在显示/隐藏导航器的左侧)。
  3. 搜索“connections”标签。
  4. 查找“connections”标签中“property”属性设置为您在异常中得到的名称的“outlet”标签。
  5. 删除该outlet标记。
  6. 按“Command + B”,享受!

2
我通过两个步骤解决了这个问题:
  1. 修复了视图的类引用:

  1. 重新导入了所有的输出口:

调整后的答案:最初的回答。

2

我在使用Storyboard和Swift类来创建UI视图控制器时遇到了问题。通过使用@objc指令解决了这个问题:

@objc(MyViewController) class MyViewController

1
在我的情况下,
[[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil]

造成问题的原因。

使用initWithNibName替换,问题解决了。


1

我在升级到Xcode7后遇到了Swift类的问题。通过使用@objc指令解决了这个问题:

@objc(XXXViewController) class XXXViewController


1
我在为表视图原型单元格创建的自定义类中遇到了一个错误,该错误发生在所有插座上。这些插座都正确连接到了故事板,并且原型单元格的身份检查器中的Class字段也正确命名。
删除并重新创建插座无效。清理构建也无效。最终有效的方法是将故事板身份检查器中的Class更改为默认的UITableViewCell,然后按Enter键,之后再将其更改回我的自定义类的名称。由于某种原因,这样做起作用了。

1

继续讲述这个史诗般的主题...

我的视图控制器上面有一个属性:

@objc(TheNameOfMyViewController)

这导致每个Outlet崩溃并显示“不符合键值”的错误。这只在IOS12及以下版本中出现问题,在iOS13上运行正常。

移除这个修饰符可以解决这个问题。现在所有的outlet都可以正常工作了。


1

我更改目标名称后出现了问题。

我的自定义UI类的模块名称设置为旧的目标名称。

我将目标名称更改为新的名称,现在它可以正常工作。


1
另一个导致这种情况的原因是您将此属性声明为 @dynamic,但是类无法在父类中找到它。

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