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

Gui*_*ois 1143 macos cocoa cocoa-touch interface-builder ios

我正在尝试将a UILabelIBOutlet我班级中的创建链接起来.

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

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

小智 1496

您的xib中可能连接不良.

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

从您的笔尖:

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

    例1

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

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

    例2

  • 谢谢!在我的情况下,我有 2 个出口到同一个视图,摆脱旧的并将视图连接到新的视图结束了异常。 (2认同)

Tec*_*Zen 945

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

我下载了你的项目.

你得到的错误是

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

它是由Second视图控制器引起的MainWindow.xib,UIViewController而不是SecondView.更改为正确的类可以解决问题.

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

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

此错误的另一个可能原因:

坏口.

您已在文件中删除重命名了插座名称.h.

将其删除.xib.storyboard文件的连接检查器.

  • 没关系.这是因为有两件事:Xcode仍在访问我的主故事板,即使它已从项目中删除,并且模拟器已将其缓存.我非常不推荐使用故事板或NIB - 它们是非常有问题的. (12认同)
  • 另外,不要忘记将nib的"视图"插座连接到文件所有者的视图插座(从UIViewController继承的自定义类的视图插座).这可以通过控制从"Place Holders"下的"File Owner"拖动到"Objects"下的"view"并选择视图插座来完成. (8认同)
  • @Josh Lol.每当我努力在xcode中创建本机应用程序时,它总是以我花费一天时间来试图弄清楚如何做任何事情.我是#dev,所以我最近一直在寻找Xamarin和Telerik(nativescript)的产品. (5认同)

Ste*_*ers 112

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

  • 如果删除应用程序不起作用,请尝试删除XCode DerivedData文件夹.它可以缓存不正确的xib文件.打开XCode - >首选项 - >位置 - >打开DerivedData文件夹并将其拖到废纸篓. (4认同)
  • +1 这为我解决了这个问题。我正在清理一些使用 IB 的代码。当我从代码中删除一个按钮时,即使 nib 文件中根本没有引用该按钮(至少我可以看到),错误仍然会弹出。 (2认同)
  • 如果您正在调试两个碰巧具有相同名称的应用程序,我发现这是必要的. (2认同)

upl*_*com 106

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

删除下图中的连接. 当文件所有者突出显示时,删除检查器中的连接

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

当突出显示表视图单元格时,连接应该在此处

  • 这对我来说非常感谢,非常感谢.当我在左栏中选择"文件所有者"时,我输出了连接,然后选择了我的自定义单元格并重新连接它们.成功! (4认同)
  • 这可行,但是您需要确保未设置FileOwner!文件所有者应保留NSObject。http://stackoverflow.com/questions/13793162/setvalueforundefinedkey-this-class-is-not-key-value-coding-compatible-for-the-k (3认同)

小智 93

有时这与你的"继承目标"有关,必须设置该值.使用单个目标应用程序,您只需选择继承自目标.如果您有多个目标,请选择所需目标.

在此输入图像描述


erk*_*diz 65

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

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

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

  • 是的,那对我来说.在展开以添加新的启动视图控制器时,我将其设置为新的类/ nib.连接视图插座后,我遇到了这个错误.清除此字段会修复它. (2认同)
  • 谢谢!这解决了我.(在将主界面字段更改为空之后,我不得不从模拟器中删除应用程序.只需更改该字段就不会强制模拟器破坏缓存.) (2认同)

Tib*_*abo 60

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

如果您看到需要修复的感叹号,请按住Control键并单击Interface Builder中的文件所有者.

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

在此输入图像描述

这会产生以下错误: 由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[setValue:forUndefinedKey:]:此类与密钥 aRemovedView 不符合密钥值编码.


Eri*_*tto 41

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

最终,我通过在Objects下面列出的Controller (下图中突出显示)链接标签,而不是通过文件所有者来解决问题.

希望这可以帮助.

在此输入图像描述


Far*_*uti 36

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

  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>
Run Code Online (Sandbox Code Playgroud)

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


ash*_*ack 33

在此输入图像描述 在此输入图像描述

我的修复与Gerard Grundy相似.在使用XIB创建自定义UITableViewCell时,我错误地将自定义类名称应用于文件所有者而不是UITableViewCell.将类应用于画布上的UITableViewCell并将我的IBOutlet属性连接到它解决了这个问题.


kub*_*ubi 30

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


小智 30

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

  • 它确实提供了问题的答案.在Nib中搞砸了一些东西并干净利落地解决了它.我阅读并尝试了以上所有内容无济于事,然后干净了,经过1小时的尝试修复后,Maj的解决方案修复了它.我很乐意看到XML中的内容可能会导致这种情况,但我已经继续前进了. (5认同)

Yan*_*nis 23

我有完全相同的错误信息,并感谢(!!)来自http://www.idev101.com Kira 我能够解决这个挑战.谷歌搜索和堆叠所有这些线程后,我才找到她的网站.我现在在这里发布下一个来到StackOverFlow并且遇到同样的挑战,因为那个人很可能会通过谷歌来到这个线程.

我意识到,我错误地做了这个:

UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];
Run Code Online (Sandbox Code Playgroud)

而不是这个:

DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];
Run Code Online (Sandbox Code Playgroud)

哪里

DeviceViewController
Run Code Online (Sandbox Code Playgroud)

我的班级的名字也被称为

DeviceViewController.h 
DeviceViewController.m
Run Code Online (Sandbox Code Playgroud)

你必须这样做

"import DeviceViewController.h"
Run Code Online (Sandbox Code Playgroud)

在你想要调用的实现(.m文件)中,例如另一个UIViewController.

如果我只是为像我这样的初学者说明显而易见并因为这与问题并不完全相关,但我现在正在搜索4(?!?)小时以获得这些错误消息的答案,我绝对不会后悔.如果我可以把这个放到1或2个人身上,那就太棒了:)

PS:对于那些对代码如何继续加载其他UIViewController感兴趣的人:

    [self presentViewController:deviceViewController animated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)


小智 23

它可能来自于您拖动控件并创建出口或操作,并忘记删除它.即使您删除了代码,或者即使您已经制作了足够的cmd + Z,也需要进入故事板的连接检查器,看看您创建的操作或插座是否仍在此处.


Sur*_*gch 20

看看其他答案,似乎有很多事情可以导致这个错误.还有一个.

如果你

  • 有自定义视图
  • 添加了一个@IBInspectable属性
  • 然后删除它

然后你可能会得到类似的错误

无法在[您的自定义视图]上设置(xxx)用户定义的检查属性...:此类与密钥[xxx]不符合密钥值编码.

解决方案是删除旧属性.

在此输入图像描述

打开您的类的Identity检查器,在User Defined Runtime Attributes下选择属性名称,然后按减号按钮( - ).


neo*_*eye 15

当我的视图控制器最初有一个.xib文件时,会发生这种情况,但现在是以编程方式创建的.

即使我已从此项目中删除.xib文件.用户iPhone/iPad可能包含此viewcontroller的.xib文件.

尝试加载.xib文件通常会导致此崩溃:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x18afe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key welcomeLabel.'
Run Code Online (Sandbox Code Playgroud)

以编程方式创建它的解决方案可能是这样的:

-(void)loadView {
    // Ensure that we don't load an .xib file for this viewcontroller
    self.view = [UIView new];
}
Run Code Online (Sandbox Code Playgroud)


erc*_*rcu 12

Identity Inspector中View Controller的"Module"属性可能与您的预期不同.还要确保将新类添加到目标列表中.


Dav*_*ney 10

对于有两个目标的项目(使用自己的MainWindow XIB),我遇到了类似的问题.导致此错误的根本问题是UIViewController类未包含在第二个项目的资源列表中.即界面构建器允许我在MainWindow.xib中指定它,但在运行时系统无法找到该类.

即cmd-单击相关的UIViewController类,并仔细检查它是否包含在"目标"选项卡中.


Ath*_*ace 9

只是添加到此,因为我也得到了这个错误.通过所有这些答案,大多数似乎适用于使用UI和故事板的东西.我知道原始海报似乎确实与UI一起工作但是当搜索这个错误的可能原因时,大多数问题都会回到这个问题,其他人被关闭作为重复或只是在故事板中连接事情的问题所以我会添加我的解决方案

我正在编写Swift 2中的Web服务编码.我已经构建了所有需要的代理对象和存根.当我浏览返回的XML时,我动态地实例化我的对象,这些对象都来自NSObject并使用setValue:forKey它们.每次setValue:forKey尝试设置属性时,它都会因此错误而爆炸.

我不得不为每种类型的我正在处理(例如,一个switch语句Bool?,CShort?,String?)和我的经历,并检查什么类型是对象上,然后转换价值那种类型,并试图用它设置每个XML节点setValue:forKey.

最后我开始评论所有这些setValue:forKey行,并发现我的defaultswitch语句案例确实有效String?.

我终于发现你不能使用可选的swift类型,setValue:forKey除非它们直接映射到Objective-C类型,如String?NSNumber?.我最终改变了所有CShort?类型,NSNumber?因为它有直接映射.对于Bool?我的情况还不错,我只是用Bool它初始化false.其他人可能没那么奢侈.

无论如何,令人头疼的是,希望这有助于其他有类似问题的人,并不断重定向到这个问题并对自己说,"我在UI中没有做任何事情!".

因此,最后重申一次键值编码不适用于选项.下面我最终找到了某个地方,但是我忘记了发布这个的人在哪里我道歉并且如果我记得我发现这个但是它挽救了我的生命会给予赞扬:

您不能在Optional Int属性上使用KVC,因为KVC是Cocoa/Objective-C,而Objective-C看不到可选Int - 它没有桥接到Objective-C.Objective-C只能看到桥接到Objective-C的类型:

从NSObject派生的类类型

使用@objc公开的类类型

桥接的Swift结构


Emy*_*ats 9

"这个类不是关键值编码兼容的关键"我知道它有点晚但我的答案是不同的所以我认为它需要发布,我是以错误的方式推动第二个控制器,这里是样本

推送控制器的错误方法

UIViewController* controller = [[UIViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];
Run Code Online (Sandbox Code Playgroud)

正确的方式

TempViewController* controller = [[TempViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];
Run Code Online (Sandbox Code Playgroud)

我没有找到像上面那样的答案,所以它可以帮助一些人有同样的问题


小智 8

这可能是从您重命名或删除的Xib接口引用组件的情况.重新引用对我有用.


kub*_*lay 8

我刚刚在我的重复项目中遇到了这个问题,并通过检查2个地方来解决:

1-确保列表中有.m文件 - >项目 - 构建阶段 - 编译源代码
2-之后,转到界面构建器(可能这只是IB发生错误)并取消链接所有属性,标签,图像等等......然后重新连接所有.我已经意识到我删除了一个属性,但它仍然在IB中链接.

希望它适用于某些人.


Jas*_*son 7

我找到的另一个"不合规"的问题是,由于某种原因我设法获得了两个班级的副本.

我正在为错误的副本添加密钥.Interface Builder仍然看到了密钥,让我联系到它们,但在运行时它使用的是没有新密钥的类的另一个副本.

为了找到哪个是"正确的"副本,我使用XCode的cmd-点击其他地方的类名来跳转到正确的副本,然后我杀掉了坏的未使用的副本(在从未使用的副本首先引入我的编辑之后).

故事的道德:重复的类文件很糟糕.


Ron*_*oh1 7

这个错误是别的!

这是我如何修复它.我正在使用xcode Version 6.1.1并使用swift.每当我的应用程序尝试执行segue跳转到下一个屏幕时,我都会收到此错误.这就是我做的.

  1. 检查按钮是否连接到正确的操作.(这不是问题,但仍然很好检查)
  2. 检查按钮是否没有您可能错误创建的任何其他操作或插座.(这不是问题,但仍然很好检查)
  3. 检查日志并确保NEXT SCREEN中的所有按钮都具有正确的操作,如果有任何segues,请确保它们具有唯一标识符.(这是问题)
    • 其中一个segue没有唯一标识符
    • 其中一个按钮有一个动作和两个我错误创建的插座.
    • 删除任何其他插座,并确保您到下一个屏幕的segues具有唯一标识符.

干杯,


Mik*_*Lin 6

我有同样的症状.根本原因是我的源文件的"目标成员资格"未设置为正确的目标.我认为这意味着我的课程不会被构建并包含在我的应用程序中.

要纠正它:

  1. 突出显示.m文件.
  2. 在右窗格中,选择"文件检查器".
  3. 在"目标成员资格"部分下,确保选中相应的构建目标.

希望这有助于那里的人.


Dam*_*amo 6

如果你有一个带有IBOutlets的自定义UIViewController子类导致问题,我发现实际摆脱错误的唯一一组步骤是

.1将类更改为UIViewController

.2断开所有插座(它们现在都有黄色警告三角形) - 仅断开有问题的插座可能就足够了.

.3执行所有标准步骤 - ↑⌘K,删除派生数据(,祈祷垫,担心珠)

.4启动应用程序 - 转到有问题的场景.

.5终止应用程序,返回Interface Builder,将类更改回自定义类名.

.6重新连接插座.

启动应用程序,这通常会清除键值合规性问题.


Mal*_*der 5

就我而言.合并后我没有在xib文件中丢失插座.

Shift + Command + K.

解决了我的问题.我清理了我的项目并重建了.


Joa*_*edt 5

就我而言,这是module指定为错误的target。只需删除module名称并检查Inherit Module from target即可解决问题。

在此输入图像描述