这是什么意思? “'NSUnknownKeyException',原因:…这个类不是密钥X的编码兼容密钥值”

我正尝试将UILabel与在我的课程中创build的IBOutlet链接起来。

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

***终止应用程序由于未捕获的exception“NSUnknownKeyException”,原因:'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]:这个类是不符合密钥编码密钥XXX。

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

我下载了你的项目。

你得到的错误是

'NSUnknownKeyException',原因:'[<UIViewController 0x3927310> setValue:forUndefinedKey:]:这个类不是密钥string的密钥值。

这是由MainWindow.xib中的Second视图控制器引起的,它具有一个UIViewController而不是SecondView 。 改为正确的类可以解决问题。

顺便说一句,Objective-C中有“string”这样的名字是不好的做法。 它会引发运行时命名冲突。 避免他们甚至在一次实践的应用程序。 命名冲突可能非常难以追查,您不想浪费时间。

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

你的xib中可能连接不好。

我有很多次这个错误。 虽然TechZen的答案在这种情况下是绝对正确的,但是另一个常见原因是,当您更改已经连接到nib中File's Owner的.h / .m 中的IBOutlet属性的名称时。

从你的笔尖:

  1. 在IB中select对象并转到“连接检查器”。
  2. 在“引用出口”下,确保你的对象没有连接到旧的属性名称…如果是, 点击小的'x'删除引用并再次构build。

    例子1

另一个常见的原因,如果你使用的故事板,你的UIButton可能有更多的一个分配(解决scheme是几乎相同的笔尖):

  1. 打开你的故事板,并右键单击UIButton
  2. 你会看到有多个分配/参考这个button。 用小“x”移除其中一个“Main …”灰色窗口:

    例2

我不得不从模拟器/ iPhone删除应用程序来摆脱这个错误。

当我试图为一个表实现一个自定义的ViewCell时,我有这个错误。 当我突出显示XIB的视图控制器,并连接到CellView中的元素导致错误“这个类是不符合键值编码的密钥”一旦我删除这些摆脱了错误。

删除下图中的连接。 文件所有者高亮显示时,删除检查员中的连接

只要确保你只有与表格视图单元的连接。 要检查点击表视图单元格,并在INSPECTOR查找您的连接。

表格视图单元格突出显示时,连接应该在这里

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

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

如果你指定一个xib在那里崩溃。

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

按住Control键并点击界面生成器中的文件所有者 ,如果您看到需要修复的感叹号

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

在这里输入图像描述

这给出了以下错误: 终止应用程序由于未捕获的exception“NSUnknownKeyException”,原因:'[setValue:forUndefinedKey:]:此类不是密钥 aRemovedView 编码兼容的键值

我有同样的问题,而TechZen的答案可能确实是惊人的,我发现很难适用于我的情况。

最终,我通过链接标签通过控制器下列出的控制器(下图中突出显示)而不是通过文件所有者解决了这个问题。

希望这可以帮助。

在这里输入图像描述

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

  1. 首先打开你的故事板作为源代码
  2. search<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> 

正如你所看到的,这些是你的代码variables名称和故事板布局xml标签之间的连接;)

只有在设备(iPhone)上进行debugging时才会发生这种情况。 iOS模拟器工作正常。 从Xcode做“产品 – >清洁”似乎解决了这个问题,但我不知道为什么。

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

在这里输入图像描述在这里输入图像描述

我的解决方法与Gerard Grundy的相似。 在使用XIB创build自定义UITableViewCell时,我错误地将定制类名称应用于文件所有者而不是UITableViewCell。 将该类应用于canvas上的UITableViewCell并将我的IBOutlet属性连接到它解决了问题。

我有完全相同的错误信息,并感谢(!!)从http://www.idev101.com基拉我能够解决的挑战。; 我只是在Googlesearch并在所有这些线程上堆叠后才发现她的网站。 我现在在这里发布下一个涉及到StackOverFlow的问题,并且遇到了同样的挑战,因为那个人很可能会通过Google进行这个讨论。

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

 UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil]; 

而不是这个:

 DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil]; 

哪里

 DeviceViewController 

是我的class级的名字也被称为

 DeviceViewController.h DeviceViewController.m 

你必须

 "import DeviceViewController.h" 

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

如果我只是对像我这样的初学者这样的明显的话,我绝对不会感到抱歉,因为这个问题与这个问题并不完全相关,所以我现在正在search4(?!?)小时以回答这些错误信息。 如果我可以把这一切放到1或2个人那会很棒:)

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

  [self presentViewController:deviceViewController animated:YES completion:nil]; 

有时这与你的“从目标inheritance”有关,必须设置该值。 使用单个目标应用程序,您可以select从目标inheritance。 如果您有多个目标,请select所需的目标。 在这里输入图像描述

这发生在我当我的视图控制器最初有一个.xib文件,但现在是以编程方式创build。

即使我从这个项目中删除了.xib文件。 用户iPhone / iPad可能包含该视图控制器的.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.' 

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

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

我有一个类似的问题,有两个目标(与他们自己的MainWindow XIB)的项目。 导致这个错误的根本问题是UIViewController类不包括在第二个项目的资源列表中。 即界面生成器允许我在MainWindow.xib中指定它,但在运行时,系统找不到该类。

也就是说,在命令中点击UIViewController类,然后仔细检查它是否包含在“目标”选项卡中。

看看其他的答案,似乎有很多事情可能会导致此错误。 这里还有一个。

如果你

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

那么你也可能会得到类似的错误

无法在[您的自定义视图]上设置(xxx)用户定义的检查属性…:该类不是关键字[xxx]的编码兼容值。

解决方法是删除旧的属性。

在这里输入图像描述

打开class级的“标识”检查器,在“用户定义的运行时属性”下select属性名称,然后按减号button( – )。

这可能是从Xib接口引用了一个已经重命名或删除的组件。 重新引用为我工作。

我只是在我的重复项目中有这个问题,并通过检查2个地方解决:

1-确保在列表中包含.m文件 – > Project – Build Phases – Compile Sources
2-之后,进入界面生成器(可能这是一个只有IB发生的错误),并取消所有的属性,标签,图像等链接…然后重新链接所有。 我已经意识到,我已经删除了一个属性,但它仍然在IB连接。

希望它适用于一些。

另一个“不合规”的问题是,当我因为某种原因而设法获得了两个class级的副本时。

我正在向错误的副本添encryption钥。 界面生成器仍然看到了键,让我连接到他们,但在运行时,它正在使用没有新键的类的另一个副本。

要find哪个是“正确的”副本,我使用XCode的cmd单击类别名称在其他地方跳到正确的副本,然后我杀了坏的未使用的副本(先从未使用的副本带来我的编辑)。

故事的道德:重复的类文件是不好的。

Identity Inspector中View Controller的“Module”属性可能与您所期望的不同。 还要确保将新类添加到您的目标列表中。

只是添加到这,因为我也得到这个错误。 通过所有这些答案大部分似乎适用于使用UI和故事板的东西。 我知道原来的海报似乎是与用户界面的工作,但是当search这个错误的可能原因大多是所有问题都导致这个问题与其他人被closures作为重复或只是有问题连接故事板的东西,所以我会加我的解决scheme。

我正在编写Swift 2中的Web服务。我已经构build了所有需要的代理对象和存根。 当我通过返回的XML循环时,我dynamic地实例化了所有来自NSObject对象,并使用了setValue:forKey 。 每次setValue:forKey试图设置一个属性,它发生这个错误。

我为每个我正在处理的types(例如Bool?CShort?String? )都有一个switch语句,并且检查了每个XML节点,并检查对象上的types,然后将该值转换为该types并尝试使用setValue:forKey进行设置。

最终我开始注释掉所有这些setValue:forKey行,并发现我的default switch语句的情况下工作的String?

我终于明白,你不能使用可选的swifttypes与setValue:forKey除非他们有一个直接映射到一个Objective-Ctypes如String? 还是NSNumber? 。 我最终改变了所有CShort? types为NSNumber? 因为这有一个直接的映射。 对于Bool? 在我的情况下,使用Bool并将其初始化为false Bool 。 其他人可能没有那么奢侈。

无论如何,这是一个令人头痛的希望,这有助于其他有类似问题的人,并不断重新回到这个问题上,并对自己说:“我没有在UI做任何事情!”。

所以最后再重申一次键值编码不适用于可选项。 下面我最终find了某个地方,但是我忘记了在哪里发布这个,我道歉,如果我记得我发现这个地方,但是它救了我的命:

您不能在可选的Int属性上使用KVC,因为KVC是Cocoa / Objective-C,而Objective-C看不到可选的Int – 它不会桥接到Objective-C。 Objective-C只能看到桥接到Objective-C的types:

从NSObject派生的类types

使用@objc公开的类types

迅速的结构被桥接

“这个类不是关键的编码密钥的关键”我知道它有点晚了,但我的答案是不同的,所以我认为它需要张贴,我推错了第二个控制器,这里是样本

错误的方式来推动控制器

 UIViewController* controller = [[UIViewController alloc]initWithNibName:@"TempViewController" bundle:nil]; [self.navigationController pushViewController:controller animated:true]; 

正确的方法

 TempViewController* controller = [[TempViewController alloc]initWithNibName:@"TempViewController" bundle:nil]; [self.navigationController pushViewController:controller animated:true]; 

我没有find像上面这样的答案,所以可能会帮助一些人有同样的问题

这个错误是别的!

这是我如何解决它。 我正在使用xcode版本6.1.1并使用swift。 每当我的应用程序试图执行一个跳转到下一个屏幕,我得到这个错误。 在这里,我做了什么。

  1. 检查button是否连接到正确的操作(这不是问题,但仍然很好检查)
  2. 检查该button没有任何您可能错误地创build的附加动作或sockets。 (这不是问题,但仍然很好检查)
  3. 检查日志并确保下一个屏幕中的所有button都具有正确的操作,并且如果有任何segse,请确保它们具有唯一的标识符。 (这是问题)
    • 其中一个赛段没有一个唯一的标识符
    • 其中一个button有一个动作,我错误地创build了两个插口。
    • 删除任何额外的sockets,并确保你到下一个屏幕的赛段有唯一的标识符。

干杯,

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

我有同样的症状。 根本原因是我的源文件的“目标成员”没有设置为正确的目标。 我认为这意味着我的课不会被build立和包含在我的应用程序。

纠正它:

  1. 突出显示您的.m文件。
  2. 在右侧窗格中,select文件检查器。
  3. 在“目标成员”部分下,确保选中适当的构build目标。

希望这可以帮助那里的人。

我是故事板得到这个错误。 上面的解决scheme似乎没有问题,所以我最终删除了视图控制器,并重新添加它(当然重新连接segue和重新分配类)修复它。 我不知道它到底是什么,但是在开始之前不久我就重命名了相关的视图控制器类,所以也许已经有了一些东西。

我遇到了同样的问题。 我没有重置模拟器。 删除并添加button控件。 终于干净了。 :)感谢堆栈溢出。 一些如何我的代码变好,开始工作。

我有同样的问题。 我在一个XIB文件中创build了一个tableviewCell,并且遇到了这样的错误。 我的问题是我定义“文件的所有者”类是我的单元格视图控制器。 我只是把它拿出来,并设置单元格的类(在xib文件上单击单元格的边框,转到右侧面板上的第三个选项卡,它说类select了你的视图控制器)。

也尝试清理你的代码。

就我而言,这是由于引用了错误的Nib引起的:

 BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil]; 

您可能有UI元素的sockets,但在.h文件中没有IBOutlet属性

连接属性检查sockets中的所有UI元素和.h头文件中的相应属性。

.h文件中可能缺less一个或多个属性项。