题 这是什么意思? “'NSUnknownKeyException',原因:...此类不是键值X的键值编码兼容”


我正在尝试链接一个 UILabel 与 IBOutlet 在我班上创造。

我的应用程序崩溃,出现以下错误。这是什么意思?我该如何解决?

***由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]:此类不是密钥值,与密钥XXX兼容。


983


起源


pedrotorres是对的。是的,这是对的。如果你正在做一个UITableViewCell,在IB中记得把文件的所有者变成NSObject,把UITableViewCell'Class变成你定义的.h类。 - giuseppe
当你遇到这样的问题而且有问题的关键是 行动 而不是一个 出口 然后很可能你有一个 出口 哪个错误地引用了你的 行动 功能名称而不是你的 出口 变量名。 - Alex Yursha
您应该注意到错误消息中的密钥名称(OP称其为'XXXX')是您为nib文件中的内容指定的名称。这应该有助于缩小搜索范围。 - kris
我提交了rdar:// 22105925,要求Apple在构建时使这些错误更加明显。 :) - jtbandes
如何实际上立即解决问题! stackoverflow.com/a/13812660/294884 很棒的小费 - Fattie


答案:


你的视图控制器可能在你的xib中有错误的类。

我下载了你的项目。

你得到的错误是

'NSUnknownKeyException',原因:'[<UIViewController 0x3927310> setValue:forUndefinedKey:]:此类不是密钥值的密钥值编码兼容。

这是由 Second 查看控制器 MainWindow.xib 有一类 UIViewController 代替 SecondView。更改为正确的类可以解决问题。

顺便说一下,在Objective-C中使用像“string”这样的名称是不好的做法。它会引发运行时命名冲突。即使在一次性练习应用程序中也避免它们命名冲突可能很难追踪,您不想浪费时间。

此错误的另一个可能原因是:当将元素从一个控制器复制并粘贴到另一个控制器时,Xcode会以某种方式将该链接保留到原始控制器,即使在编辑并将此元素重新链接到新控制器之后也是如此。


808



另外,不要忘记将nib的“视图”插座连接到文件所有者的视图插座(从UIViewController继承的自定义类的视图插座)。这可以通过控制从“占位符”下的“文件所有者”拖动到“对象”下的“视图”并选择视图插座来完成。 - Nirma
我已确定所有类已经设置,但NSUnknownKeyException仍然出现:( - Zennichimaro
我甚至没有使用Interface Builder,我仍然遇到这个错误。知道发生了什么事吗? - sudo
没关系。这是因为有两件事:Xcode仍在访问我的主故事板,即使它已从项目中删除,并且模拟器已将其缓存。我非常不推荐使用故事板或NIB - 它们是非常有问题的。 - sudo
@Josh Lol。每当我努力在xcode中创建本机应用程序的动机时,我总是花费一天的时间来试图弄清楚如何做任何事情。我是一个c#dev,所以我最近一直在寻找Xamarin和Telerik(nativescript)提供的产品。 - The Muffin Man


您的xib中可能连接不良。

我多次犯过这个错误。虽然TechZen在这种情况下的答案绝对正确,但另一个常见原因是你 更改IBOutlet属性的名称 在您的.h / .m中,您已经连接到笔尖中的文件所有者。

从你的笔尖:

  1. 在IB中选择对象并转到“Connections Inspector”。
  2. 在“引用Outlets”下,确保您的对象仍未连接到旧属性名称...如果是, 单击小'x'删除引用 并再次建立。

    example 1

如果你使用Storyboard是另一个常见原因,你的UIButton可能有多个分配(解决方案几乎与nib相同):

  1. 打开故事板并右键单击UIButton
  2. 您将看到此按钮有多个assign / ref。 使用小“x”删除其中一个“Main ...”灰色窗口:

    example 2


1397



谢谢!在我的情况下,我有两个出口到同一个视图,并摆脱旧的,并将视图挂钩到新的一个结束了异常。 - Mark Patterson
我的重复了两次。我从Pro版本(来自Lite版本)拖放后认为它挂在另一个项目中的连接上,我开始断开每一个。当我遇到副本,并且需要3次点击才能断开连接时,我真诚地希望我提前3天完成。哦,这就是开发者的生活。 - aremvee
我遇到的问题是UIButton有多个任务。这解决了我的问题。 - mythicalcoder
我也有这个问题。不要忘记在特定视图中检查插座连接,而不仅仅是超视图。在我的情况下,超级视图没有显示错误的连接= / - Augusto Carmo
我有一个类似的错误,我将按钮插座连接到错误的ViewController swift文件,其页面尚未使用GUI创建 - brw59


我不得不从模拟器/ iPhone中删除该应用程序以摆脱此错误。


101



+1这为我修好了。我正在清理一些使用IB的代码。当我从代码中删除一个按钮时,即使在nib文件中根本没有引用该按钮,错误仍然会弹出(至少我可以看到)。 - SundayMonday
如果您正在调试两个碰巧具有相同名称的应用程序,我发现这是必要的。 - Anton
是的,似乎XIB中的某些东西被缓存在模拟器上,如果您正在测试升级,这是一件很痛苦的事情,因为您实际上不想删除旧的应用程序。 - Carlos P
我有这个问题删除我的XIB文件。这解决了这个问题。 - balboa
如果删除应用程序不起作用,请尝试删除XCode DerivedData文件夹。它可以缓存不正确的xib文件。打开XCode - >首选项 - >位置 - >打开DerivedData文件夹并将其拖到废纸篓。 - Philip Fung


当我尝试为表实现自定义ViewCell时,我遇到了这个错误。当我突出显示XIB的View控制器并连接到CellView中的元素时,导致错误“此类不是键值的关键值编码 - 一旦我删除了它,它就摆脱了错误。

删除下图中的连接。 Delete the connections in inspector when File Owner is highlighted

只需确保您只与表视图单元格建立连接。要检查单击表视图单元格并在INSPECTOR中查找您的连接。

The connection should be in here when Table View Cell is highlighted


84



这对我来说非常感谢,非常感谢。当在左栏中选择“文件所有者”时,我输出连接,然后选择我的自定义单元格并重新连接它们。成功! - Rogare
即使使用xcode7,只需使用右侧面板“Connections inspector”即可。从tableviewcell和标签中删除插座,然后重新添加它,一切都应该工作。 - lifeisfoo
这有效,但你需要确保FileOwner没有设置!文件所有者应保留NSObject。 stackoverflow.com/questions/13793162/... - user2704776


如果它是仅限iPhone的应用程序,而不是通用应用程序,请确保以下字段为空:

目标>摘要> iPhone / iPod部署信息>主界面

如果你在那里指定了一个xib,它会崩溃。


61



是的,那对我而言。在展开以添加新的启动视图控制器时,我将其设置为新的类/ nib。连接视图插座后,我遇到了这个错误。清除此字段会修复它。 - terriblememory
这对我有用。请注意,我还必须从设备/模拟器中删除旧版本才能使用它。 - jimt
谢谢 - 这是我的问题。我已将我的iPad故事板文件重命名,并且未在我的项目的首选项中更新。 - RobertJoseph
谢谢!这解决了我。 (在将主界面字段更改为空之后,我不得不从模拟器中删除应用程序。只需更改该字段就不会强制模拟器破坏缓存。) - snipe
我记得我将通用应用程序中的内容更改为仅限iphone的应用程序,这修复了错误! - Justin


此错误表示已连接的Interface Builder 对象被删除/重命名 在其所有者的来源(文件所有者)。

按住Control键并单击 文件的所有者 在Interface Builder中,如果你看到一个 感叹号 你需要解决这个问题。

在下面的图片中,您可以看到“aRemovedView”右侧有一个感叹号,这是因为我已经删除了IBOutlet视图对象,因为它已在IB中连接。

enter image description here

这会出现以下错误: 由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[setValue:forUndefinedKey:]:此类不是密钥值编码兼容的密钥 aRemovedView。”


56



谢谢!这为我修好了。我已经有很长一段时间没有这个问题,除了从头开始,我不知道如何修复它。就是这样,从视图控制器中删除了IBOutlets,但是不知道它们仍然在所有者中被引用/链接(在本例中是界面构建器中的“View Controller” - Xcode 6)。 - Ira Herman


我有同样的问题,虽然TechZen的答案可能确实令人惊讶,但我发现很难适用于我的情况。

最终我通过下面列出的Controller链接标签解决了这个问题 对象 (在下图中突出显示)而不是通过 文件所有者

希望这可以帮助。

enter image description here


40





有时这与您的“从目标继承”有关,必须设置该值。使用单个目标应用程序,您只需选择继承自目标。如果您有多个目标,请选择所需目标。 enter image description here


40



这个答案帮助了我一个特定的案例。我必须继续处理具有多个目标的旧obj-c项目。我在Swift中创建了一个自定义的UITableViewCell,但我遇到了同样的错误。通过启用“继承自目标”,它起作用了。谢谢! - magohamoth
这是真正的解决方案。你救了我的命 - Deniz Yazar
模块并不总是正确设置;例如如果在实际创建类之前填写类名。 - Johan


在我的情况下,故事板源代码中的错误,请按照下列步骤操作:

  1. 首先打开你的故事板作为源代码
  2. 搜索 <connections>
  3. 删除不需要的连接

例如:

<connections>
    <outlet property="mapPostsView" destination="4EV-NK-Bhn" id="ubM-Z6-mwl"/>
    <outlet property="mapView" destination="kx6-TV-oQg" id="4wY-jv-Ih6"/>
    <outlet property="sidebarButton" destination="6UH-BZ-60q" id="8Yz-5G-HpY"/>
</connections>

如您所见,这些是您的代码变量名称和storyboard布局xml标记之间的连接;)


33



为我工作:) - Navneet Krishna


只有在设备(iPhone)上进行调试时才会发生这种情况。 iOS模拟器工作正常。从Xcode做“Product-> Clean”似乎解决了这个问题,但我不明白为什么。


29



这解决了我的问题。 tsk2x近3天头痛。 - user3818576
它确实提供了问题的答案。在Nib中搞砸了一些东西并干净利落地解决了它。我阅读并尝试了以上所有内容但无济于事,然后干净了,经过1小时的尝试修复它,Maj的解决方案修复了它。我很乐意看到XML中的内容可能会导致这种情况,但我已经继续前进了。 - LevinsonTechnologies
这确实解决了这个问题 - 我上面尝试了很多建议,只是项目清理修复了突然发生的这个错误。雪地... - DustinB
这解决了我的问题,我尝试了很多以上的建议。好像很奇怪! - Naveen Shan


  1. 你只需要指定 IBOutlet 一旦 IBOutlet 标签你的ivar是不必要的。
  2. 你是否使用你的实例化你的NIB UIViewController?在某些时候你应该打电话 [SecondView initWithNibName:@"yourNibName" bundle:nil];

27



这有帮助!我从不同的视图控制器获得关于属性的键值编码合规性错误。事实证明我在打电话 -initWithNibName 使用错误的笔尖名称。 - jlstrecker
是的,这对我也有帮助..我使用的是UIViewController而不是MyCustomeViewController ..但这是一种层次结构问题可能是..内省因为错过了放置类对象而失败..谢谢你们 - Futur