这是什么意思? “'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属性的名称时。
从你的笔尖:
- 在IB中select对象并转到“连接检查器”。
-
在“引用出口”下,确保你的对象没有连接到旧的属性名称…如果是, 点击小的'x'删除引用并再次构build。
另一个常见的原因,如果你使用的故事板,你的UIButton可能有更多的一个分配(解决scheme是几乎相同的笔尖):
- 打开你的故事板,并右键单击UIButton
-
你会看到有多个分配/参考这个button。 用小“x”移除其中一个“Main …”灰色窗口:
我不得不从模拟器/ iPhone删除应用程序来摆脱这个错误。
当我试图为一个表实现一个自定义的ViewCell时,我有这个错误。 当我突出显示XIB的视图控制器,并连接到CellView中的元素导致错误“这个类是不符合键值编码的密钥”一旦我删除这些摆脱了错误。
删除下图中的连接。
只要确保你只有与表格视图单元的连接。 要检查点击表视图单元格,并在INSPECTOR查找您的连接。
如果是仅iPhone应用程序,而不是通用程序,请确保以下字段为空:
目标>摘要> iPhone / iPod部署信息>主界面
如果你指定一个xib在那里崩溃。
此错误表示已连接的Interface Builder 对象在其所有者的来源(文件所有者)中被删除/重命名 。
按住Control键并点击界面生成器中的文件所有者 ,如果您看到需要修复的感叹号 。
在下图中,您可以看到“aRemovedView”右侧有一个感叹号,这是因为我已经在IB中连接了IBOutlet视图对象。
这给出了以下错误: 终止应用程序由于未捕获的exception“NSUnknownKeyException”,原因:'[setValue:forUndefinedKey:]:此类不是密钥 aRemovedView 编码兼容的键值 。
我有同样的问题,而TechZen的答案可能确实是惊人的,我发现很难适用于我的情况。
最终,我通过链接标签通过控制器下列出的控制器(下图中突出显示)而不是通过文件所有者解决了这个问题。
希望这可以帮助。
在我的情况下,这是故事板源代码中的错误,请按照下列步骤操作:
- 首先打开你的故事板作为源代码
- search
<connections>
- 删除不需要的连接
例如:
<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做“产品 – >清洁”似乎解决了这个问题,但我不知道为什么。
- 您只需要指定
IBOutlet
一次,IBOutlet
标签您的伊娃是不必要的。 - 你使用你的
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。 每当我的应用程序试图执行一个跳转到下一个屏幕,我得到这个错误。 在这里,我做了什么。
- 检查button是否连接到正确的操作(这不是问题,但仍然很好检查)
- 检查该button没有任何您可能错误地创build的附加动作或sockets。 (这不是问题,但仍然很好检查)
- 检查日志并确保下一个屏幕中的所有button都具有正确的操作,并且如果有任何segse,请确保它们具有唯一的标识符。 (这是问题)
- 其中一个赛段没有一个唯一的标识符
- 其中一个button有一个动作,我错误地创build了两个插口。
- 删除任何额外的sockets,并确保你到下一个屏幕的赛段有唯一的标识符。
干杯,
它可能来自于你控制拖动并创build出口或动作的事实,并忘记删除它。 即使您删除了代码,或者即使您已经制作了足够多的cmd + Z,您也需要进入故事板的连接检查器,查看您创build的操作或插件是否仍在此处。
我有同样的症状。 根本原因是我的源文件的“目标成员”没有设置为正确的目标。 我认为这意味着我的课不会被build立和包含在我的应用程序。
纠正它:
- 突出显示您的.m文件。
- 在右侧窗格中,select文件检查器。
- 在“目标成员”部分下,确保选中适当的构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一个或多个属性项。