What does this mean? “'NSUnknownKeyException', reason: … this class is not key value coding-compliant for the key X”
我正在尝试将
我的应用程序因以下错误而崩溃。这是什么意思?我怎么修?
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[
setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key XXX.'
你的关系可能不好。
我犯过很多次这个错误。虽然Techzen的回答在这种情况下是绝对正确的,但另一个常见的原因是您更改了.h/.m中已连接到NIB中文件所有者的iboutlet属性的名称。
从你的笔尖:
在"引用出口"下,确保您的对象没有连接到旧的属性名…如果是,请单击小的"x"删除引用并重新生成。
另一个常见的原因是,如果您使用故事板,uibutton可能有多个分配(解决方案几乎与nib相同):
您将看到此按钮有多个分配/引用。删除一个带有小"X"的灰色"主…"窗口:
视图控制器在XIB中的类可能不正确。
我下载了你的项目。
你得到的错误是
'NSUnknownKeyException', reason: '[
setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key string.'
这是由于
顺便说一下,在Objective-C中使用"string"这样的名称是不好的做法,它会引起运行时命名冲突。即使在一次性练习应用程序中也要避免使用。命名冲突很难被跟踪,您不想浪费时间。
此错误的另一个可能原因是:当将元素从一个控制器复制和粘贴到另一个控制器时,Xcode以某种方式将该链接保留到原始控制器,即使在编辑并将此元素重新链接到新控制器之后也是如此。
此错误的另一个可能原因:
不良出口。
您已经在
在
为了消除这个错误,我不得不从模拟器/iPhone中删除这个应用程序。
当我试图实现表的自定义viewcell时,出现了这个错误。当我突出显示XIB的视图控制器并连接到CellView中的元素时,导致了错误"这个类不是键值编码兼容的键",一旦我删除了这些,它就消除了错误。
删除下图中的连接。
只需确保您只与表视图单元格有连接。若要检查,请单击"表视图"单元格,然后在"检查器"中查找连接。
有时这与您的"从目标继承"有关,必须设置该值。使用单目标应用程序,您可以选择从目标继承。如果您有多个目标,请选择所需的目标。
如果它是仅限iPhone的应用程序,而不是通用应用程序,请确保以下字段为空:
目标>摘要>iPhone/iPod部署信息>主界面
如果指定xib,它将崩溃。
此错误表示已连接的接口生成器对象在其所有者的源(文件的所有者)中被删除/重命名。
控件单击界面生成器中文件的所有者,如果您看到需要修复的感叹号。
在下面的图片中,您可以看到"aremovedview"的右边有一个感叹号,这是因为我在ib中连接iboutlet视图对象时删除了它。
这会产生以下错误:由于未捕获的异常"nsUnknownKeyException",正在终止应用程序,原因:"[setValue:ForUndefinedKey:":此类不是键aremovedView的键值编码兼容项。
我也有同样的问题,虽然Techzen的答案可能确实令人惊讶,但我发现很难将其应用到我的情况中。
最后,我通过对象下列出的控制器(下图中突出显示)链接标签,而不是通过文件所有者来解决这个问题。
希望这有帮助。
在我的例子中,它是故事板源代码中的一个错误,请遵循以下步骤:
例如:
1 2 3 4 5 | <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> |
如您所见,这些是代码变量名称和情节提要布局XML标记之间的连接;)
我的修复方法与Gerard Grundy的类似。在使用XIB创建自定义UITableViewCell时,我错误地将自定义类名应用于文件的所有者,而不是UITableViewCell。将类应用到画布上的UITableViewCell,并将我的IBoutlet属性连接到它,解决了这个问题。
只有在设备(iPhone)上进行调试时,我才会遇到这种情况。iOS模拟器工作正常。从xcode做一个"product->clean"似乎可以解决这个问题,但我不知道为什么。
这可能是因为您已经控制了拖动并创建了一个出口或操作,但忘记了删除它。即使您删除了代码,或者即使您已经制作了足够的Cmd+Z,您也需要进入故事板的连接检查器,查看您创建的操作或出口是否仍在这里。
我收到了同样的错误信息,谢谢(!!)从http://www.idev101.com发来的Kira,我解决了这个问题。我只是在谷歌搜索和堆积了所有这些线索后才找到她的网站。我现在在这里发布下一个关于stackoverflow的帖子,和我有同样的挑战,因为那个人很可能会通过google进入这个话题。
我意识到,我做错了:
1 | UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil]; |
而不是这个:
1 | DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil]; |
在哪里?
1 | DeviceViewController |
我班的名字也叫
1 2 | DeviceViewController.h DeviceViewController.m |
你必须
1 | "import DeviceViewController.h" |
在您要调用的实现(.m文件)中,例如,另一个uiviewcontroller。
如果我只对像我这样的初学者说明显的话,我绝对不会感到抱歉,因为这与问题并不完全相关,但我正在搜索4(???)对于这些错误消息的答案,现在已经是几个小时了。如果我能把这个留给一两个人,那就太好了:)
PS:对于那些对代码如何继续加载其他uiviewcontroller感兴趣的用户:
1 | [self presentViewController:deviceViewController animated:YES completion:nil]; |
查看其他答案,似乎有很多事情会导致此错误。这里还有一个。
如果你
- 具有自定义视图
- 添加了@IBinspectable属性
- 然后删除了它
然后您可能会得到一个类似于
Failed to set (xxx) user defined inspected property on [Your Custom
View] ...: this class is not key value coding-compliant for the key
[xxx].
解决方案是删除旧属性。
打开类的标识检查器,在用户定义的运行时属性下选择属性名,然后按减号按钮(-)。
当视图控制器最初有一个.xib文件,但现在是以编程方式创建时,我会遇到这种情况。
即使我已经从这个项目中删除了.xib文件。用户iphone/ipad可能包含此viewcontroller的.xib文件。
尝试加载.xib文件通常会导致此崩溃:
1 | Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x18afe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key welcomeLabel.' |
以编程方式创建时的解决方案可能是:
1 2 3 4 | -(void)loadView { // Ensure that we don't load an .xib file for this viewcontroller self.view = [UIView new]; } |
标识检查器中视图控制器的"模块"属性可能与您预期的不同。还要确保将新类添加到目标列表中。
对于一个有两个目标(有自己的主窗口XIB)的项目,我也遇到了类似的问题。导致这个错误的根本问题是uiviewController类没有包含在第二个项目的资源列表中。也就是说,接口生成器允许我在mainwindow.xib中指定它,但是在运行时系统找不到类。
也就是说,cmd单击有问题的uiviewcontroller类,然后再次检查它是否包含在"目标"选项卡中。
这可能是引用已重命名或删除的XIB接口中的组件的情况。重新引用对我来说很有用。
只是为了增加这个,因为我也得到了这个错误。浏览所有这些答案似乎最适用于使用用户界面和故事板。我知道最初的海报看起来确实在使用UI,但是当搜索此错误的可能原因时,大多数问题都会导致这个问题,其他问题会作为重复项关闭,或者只是在故事板中连接事物时出现问题,因此我将添加我的解决方案。
我正在编写Swift2中的Web服务代码。我已经构建了所有需要的代理对象和存根。当我遍历返回的XML时,我动态地实例化了我的对象,这些对象都来自于
对于我处理的每种类型(如
最后,我开始评论所有这些
我最后发现,如果没有直接映射到像
不管怎样,这是多么令人头疼的一件事,所以希望这能帮助其他有类似问题的人,并不断被重定向到这个问题,并对自己说,"我在UI中没有做任何事情!!
因此,最后再次重申一个时间键值编码不适用于选项。在下面,我找到了一个地方,但我忘记了在哪里,所以我向张贴这张照片的人道歉,如果我记得在哪里找到了这张照片,但它救了我的命,我会给予表扬:
You cannot use KVC on an Optional Int property, because KVC is Cocoa /
Objective-C, and Objective-C cannot see an Optional Int - it is not
bridged to Objective-C. Objective-C can only see types that are
bridged to Objective-C:class types that are derived from NSObject
class types that are exposed with @objc
Swift structs that are bridged
我刚刚在我的复制项目中遇到了这个问题,通过检查两个位置解决了这个问题:
1-确保列表中有.m文件->项目-生成阶段-编译源文件2-之后,转到Interface Builder(这可能是仅使用ib时发生的错误),并取消链接所有属性、标签、图像等…然后重新链接所有。我已经意识到我已经删除了一个属性,但它仍然在ib中链接。
希望对一些人有用。
"此类不符合密钥的密钥值编码"我知道有点晚了,但我的答案不一样,所以我认为需要贴出来,我把第二个控制器推错了,这是样品
推动控制器的方法错误
1 2 3 | UIViewController* controller = [[UIViewController alloc]initWithNibName:@"TempViewController" bundle:nil]; [self.navigationController pushViewController:controller animated:true]; |
正确方法
1 2 3 | TempViewController* controller = [[TempViewController alloc]initWithNibName:@"TempViewController" bundle:nil]; [self.navigationController pushViewController:controller animated:true]; |
我没有找到像上面这样的答案,所以也许它可以帮助有同样问题的人。
这是另外一个错误!
以下是我如何修复的。我使用的是Xcode版本6.1.1和Swift。每次我的应用程序试图执行SEgue跳转到下一个屏幕时,我都会遇到这个错误。这就是我所做的。
- 其中一个段没有唯一标识符
- 其中一个按钮有一个动作和两个插座,这是我错误创建的。
- 删除任何其他插座,并确保您进入下一个屏幕的段具有唯一的标识符。
干杯,
我发现的另一个"不符合"的问题是,由于某种原因,我设法获得了一个类的两个副本。
我把钥匙加错了。接口生成器仍然看到了这些键,并让我连接它们,但在运行时它使用的是没有新键的类的另一个副本。
为了找出哪个是"正确"的拷贝,我使用xcode的cmd,单击别处的类名跳到正确的拷贝,然后我删除了坏的未使用的拷贝(先从未使用的拷贝中恢复我的编辑)。
故事的寓意:重复的类文件很糟糕。
我也有同样的症状。根本原因是源文件的"目标成员"未设置为正确的目标。我想这意味着我的类不会被构建并包含在我的应用程序中。
改正它:
希望这能帮助别人。
如果您有一个带有iboutlets的自定义uiviewcontroller子类,这会导致问题,那么我发现实际消除错误的唯一步骤是
.1将类更改为uiviewcontroller
.2断开所有插座(它们现在都有黄色三角警告)-只需断开有问题的插座即可。
.3所有的标准步骤都是–↑?k,删除派生数据(,祈祷垫,担心珠)
.4启动应用程序-转到有问题的场景。
.5终止应用程序,返回到Interface Builder将类更改回自定义类名。
.6重新连接插座。
启动应用程序&;这通常会清除关键值合规性问题。
以我为例。合并后,xib文件中没有丢失的出口。
Shift + Command + K
解决了我的问题。我清理了我的项目并重建了它。
在我的例子中,这是由引用错误的笔尖引起的:
1 | BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil]; |
我在故事板上发现了这个错误。上面的解决方案似乎不是问题所在,所以我最终删除了视图控制器并重新添加它(当然,重新连接segue并重新分配类),修复了它。我不知道它到底是什么,但在这开始之前不久,我已经重命名了相关联的视图控制器类,所以可能它承载了一些东西。
我也有同样的问题。我确实重置了模拟器。删除和添加按钮控件。终于洗清了。:)由于堆栈溢出。我的代码如何变得正常并开始工作。
我也有同样的问题。我在一个XIB文件中创建了一个TableViewCell,并得到了这种错误。我的问题是我将"文件的所有者"类定义为我的单元视图控制器。我刚把它拿出来并设置了单元的类(在xib文件中,单击单元的边界,转到右面板的第三个选项卡,在那里它说类选择了视图控制器)。
还可以尝试清除代码。
对于连接属性检查outlets中的所有ui元素,.h文件中可能有outlets to ui元素,但不具有iboutlet属性,.h头文件中的相应属性。.h文件中可能缺少一个或多个属性项。
您可能需要删除该插座,通过将表单ib绘制到.h文件来重新创建它。
通过在Storyboard/XIB界面中选择有问题的对象并打开"连接检查器"(View->Utilities->Show Connections Inspector),检查是否有杂散引用出口。如果你真的移除了不需要的连接,你应该走了。
我从头文件中删除了属性。我找不到任何对它的引用,但调试错误仍在引用它。我发现NIB文件仍然引用它。我删除了引用它的块,一切都已修复。
在项目导航器中,
找到NIB(XIB)文件。右键单击并查看源。我删除了以下完整部分
1 2 3 4 5 6 7 8 | <object class="IBConnectionRecord"> <object class="IBCocoaTouchOutletConnection" key="connection"> <string key="label">DeleteLabel</string> <reference key="source" ref="372490531"/> <reference key="destination" ref="774585933"/> </object> <int key="connectionID">20</int> </object> |
当视图控制器类中的两个变量引用了一个UI标签或其他UI元素,并且删除了其中一个变量时,我也会遇到这种情况。
我也有同样的问题。我的项目发生这种情况是因为我更改了我的产品名称,但是在Interface Builder中,我使用的是旧名称作为模块,这会导致崩溃,所以一定要检查所有的XIB模块名称是否也被更改。
这种情况的另一个原因是,您声明此属性实现为@dynamic,但类在父类中找不到它。
在我的例子中,viewcontroller.m中的iboutlet属性名被更改了,但故事板中的属性名没有更改。将iboutlet重新引入viewcontroller.m,按ctrl拖动解决了这个问题。我还注意到一种在Xcode中找到这种"孤立"iboutlets的方法:(看图片)那些不是"孤立"的iboutlets有同心圆而不是线号。
我在UI视图控制器的故事板和Swift类中遇到了这个问题。通过使用@objc指令解决了它:
1 | @objc(MyViewController) class MyViewController |
我在升级到xcode7之后遇到了Swift类的问题。通过使用@objc指令解决了它:
@objc(XXXviewController)类XXXviewController
我也有同样的问题,原因是在InterfaceBuilder中指定了一个模块(而不是将其留空)。所以,当我使用一个不同于我设置的模块时,应用程序会崩溃:s…希望这对别人有帮助,因为我的问题不是因为一个坏的或过时的出口!
提出了同样的问题。我的解决方案是在主情节提要下拉列表中放置正确的情节提要值。我重命名了mainstoryboard.storyboard,但没有重置部署信息。
在我看来,
1 | [[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil] |
原因就是这样。
将此项替换为initWithNibName,已解决。
这已经发生在我身上两次了。
解决方案是重新制作整个故事板,因为我从另一个故事板复制了它(因为它几乎是相同的)
当我将一个uiview链接到一个故事板并连接iboutlet时,我就发生了这种情况,比如:
1 | @property (strong, nonatomic) IBOutlet UIView *someView |
但后来,我将uiview设置为自定义类,但忘记更改上面定义的iboutlet的类名。这是一个奇怪的错误,因为如果自定义视图没有子视图,它不会抱怨,但一旦有子视图,它就会显示问题中所述的错误,但显示在其中一个子视图上,而不是实际存在问题的外部uiview上。让我删除并阅读所有的子视图,试图找出问题所在,而实际上与子视图无关
这可能意味着您正试图使用一个排序描述符,而在开始时没有使用atsign。如:
实际上必须是:
当我使用主故事板作为启动屏幕文件时,我遇到了同样的问题。我猜如果你使用一个故事板作为启动屏幕文件,它不应该连接到视图控制器,因为它还没有被加载。
我遇到同样的问题的原因不同:我使用主故事板作为启动屏幕文件。我猜如果你使用一个故事板作为启动屏幕文件,它不应该连接到视图控制器,因为它还没有被加载。
以及其他问题,你可以在其他答案中看到。我为自己创建这个错误的方式是,我从头开始一个项目,然后删除故事板的初始场景,然后将另一个项目中的一个场景粘贴到我的故事板中。
这样做没问题。您只需要添加故事板的一个入口点,即检查您喜欢的控制器上的
通常当我遇到这种情况时,@technzen的回答会起作用。然而,昨天,我花了一段令人难堪的长时间与故事板连接搞混,结果发现问题出在我的代码中。
我有一个自定义的视图控制器,可以处理故事板中的各种布局,但是其中一个布局需要一个特殊的标签,其他人不使用。所以我创建了一个这样的子类:
1 | @interface MyViewControllerSubclass : MyViewController |
然后我在myviewControllerSubclass.m中添加了一个私有属性:
1 2 3 | @interface MyViewController () @property (weak, nonatomic) IBOutlet UILabel *crashesApp; @end |
Xcode很高兴地允许我连接这个iboutlet,但是每次加载视图时,应用程序都会与旧的"不符合‘chrashesapp’键的键值"崩溃。
回顾起来,解决方案是将私有类别更改为使用正确的名称,即子类的名称:
1 2 3 | @interface MyViewControllerSubclass () @property (weak, nonatomic) IBOutlet UILabel *noMoreCrashing; @end |
在我的例子中,我在故事板中添加了一个viewcontroller,但是我没有在设计器中为它分配故事板ID。一旦我给它一个身份证,它就起作用了。
使用Xamarin/Visual Studio 2015。
我的问题是在我更改了目标名称之后开始的。
我自己的自定义UI类将模块名称设置为旧的目标名称。
我把目标名称改成了新的,现在可以用了。
我也有这个问题。我将一个带有iboutlet的视图从一个xib文件复制到另一个xib文件。即使我删除了旧的引用并创建了一个新的引用,这个错误仍然在发生。
我最终重新启动Xcode来解决这个问题。
确保在
1 2 | @implementation MySubclass @end |
我在另一个稍有不同的形式上也犯了同样的错误:
在InterfaceBuilder中,我有一个带有自定义子控制器的导航控制器。它的类名设置正确,但是NIB名称(select subcontroller,go to attributes inspector)设置为错误的文件(基本上设置为另一个目标)。将其重置为正确的文件名解决了问题。
有时不添加或从目标中删除Swift文件,请转到"目标"->"生成设置"->"编译源"->"查看是否缺少任何必需的Swift类文件。在我的例子中,由于编译中不存在Swift源文件,应用程序崩溃。
如果您想在Interface Builder中的一个单独的XIB文件中设计一个小的子视图,并且在ib中,您将它设置为与父视图相同的类,那么这个问题也会发生。
如果这样显示:
1 2 | UIViewController *vc = [[UIViewController alloc] initWithNibName:@"NameOfTheSubviewNibFile" bundle:nil]; [self.view addSubview:vc.view]; |
该视图将出现,但如果它的
1 2 | [[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil] [self.view addSubview:mySubview]; |
你会没事的!
如果你试图观察一个不存在的值,请注意。
这种情况发生在我身上的原因很简单,因为我在观察文本字段的"文本"属性时,应该改为观察"文本"属性。
是否保持选取器对象未连接?
lol 54个答案,其中没有一个是我的解决方案。讨论一个常见的错误。
在我的例子中,这是因为我的VC上有一个选择器对象,并且没有为它设置一个出口和操作。
当我只是想看看布局是什么样子的时候,我经常会让按钮等保持不连接。但似乎你不能为一个拾荒者这样做。
我发现了另一种可能引起这个问题的可能性。
当使用带有错误XIB名称的"initWithNibName"方法时,也会导致这种崩溃。
例如,您选择更改XIB文件的名称,然后foget将"initWithNibName"方法中使用的名称更改为相同的名称。
我在处理TableView单元格时遇到相同的错误日志。我发现我的uiLabels对文件的所有者和单元格类都有重复的引用出口(您可以在引用检查器中查看它)。当我删除对文件所有者的引用时,情况会好转。
我记得以前也遇到过类似的问题,我通过改变路线来解决:
1 | _vicMain = [[UIViewController alloc] initWithNibName:@"vicMainScreen" bundle:nil]; |
进入:
1 2 3 4 5 6 7 | #include"vicLogin_iPad.h" // This is the H file of the class holding the code for // processing all the IBOUtlets for the Login screen . . . _vicMain = [[vicLogin_iPad alloc] initWithNibName:@"vicMainScreen" bundle:nil]; |
注意,我最初声明uiviewcontroller初始化我的uvicmain,在使用顶部的弹出窗口后,我意识到两者都使用相同的uiviewcontroller。
被:
1)包括您的类(子视图的),以及执行上述vicmain(视图控制器对象/变量)的相同模块,在我的例子中是"viclogin ipad.h",并且:
2)使用自定义构造函数声明对象(即,使用"EDOCX1"〔0〕代替"EDOCX1"〔1〕。
问题解决了。
我希望这有帮助,因为准确指出错误消息中缺少细节是件痛苦的事…
当做海德萨蒂
另一个棘手的案例:
在ib中将viewcontroller添加到情节提要中,删除其视图并将自定义类设置为"myviewcontroller",以便从myviewcontroller.xib实例化视图。
将情节提要ID指定为相同的"MyViewController"会导致异常。
将情节提要ID更改为其他名称可以解决此问题。
我通过做两件事来解决这个问题:
我遇到问题的原因是,我复制了一个故事板文件(xcode之外,如果我正确调用的话),那么复制文件中的所有视图控制器都具有与原始文件相同的对象ID。补救方法是复制粘贴的视图控制器,然后它们将获得一个新的对象ID。您可以在标识检查器中看到对象ID。