我试图连接一个UILabel
与IBOutlet
我的类创建的。
我的应用程序崩溃并出现以下错误。
这是什么意思?
我该如何解决?
***由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]:此类与键XXX的编码不兼容。
我试图连接一个UILabel
与IBOutlet
我的类创建的。
我的应用程序崩溃并出现以下错误。
这是什么意思?
我该如何解决?
***由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]:此类与键XXX的编码不兼容。
Answers:
我下载了您的项目。
您得到的错误是
''NSUnknownKeyException',原因:'[<UIViewController 0x3927310> setValue:forUndefinedKey:]:此类与密钥字符串的编码不兼容。
它是由Second
视图控制器MainWindow.xib
具有UIViewController
而不是的SecondView
类引起的。更改为正确的类可以解决问题。
顺便说一句,在Objective-C中使用“字符串”之类的名称是不好的做法。它会引发运行时命名冲突。即使在一次性练习应用中也要避免使用它们。命名冲突很难跟踪,您也不想浪费时间。
导致此错误的另一个可能原因:将元素从一个控制器复制并粘贴到另一个控制器时,即使在将元素编辑并重新链接到新控制器之后,Xcode也会以某种方式将其链接保留到原始控制器。
此错误的另一个可能原因:
坏插座。
您已删除或重命名了.h
文件中的插座名称。
将其删除.xib
或放入.storyboard
文件的“连接检查器”中。
一个可能的原因
(以我为例)扩展具有可绑定属性的UIView并为这些可绑定属性设置值(例如,阴影,拐角半径等),然后从UIView扩展中删除这些属性(出于某种原因),但以下内容<userDefinedRuntimeAttributes>
仍保留在xml中(of foo.storyboard
):
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
<color key="value" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
<real key="value" value="50"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="point" keyPath="shadowOffset">
<point key="value" x="5" y="5"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
<real key="value" value="16"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="borderWidthValue">
<real key="value" value="0.0"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
解决方案:右键单击foo.storyboard
>作为源代码打开>通过keyPath搜索(即shadowRadius)>删除</userDefinedRuntimeAttributes>
引起问题的
我多次遇到此错误。尽管在这种情况下TechZen的答案是绝对正确的,但另一个常见的原因是当您在.h / .m中更改了IBOutlet属性的名称时,该名称已经连接到笔尖的File Owner。
从您的笔尖:
如果您使用的是Storyboard,则另一个常见的原因是,您的UIButton可能有一个以上的分配(解决方案与nib几乎相同):
我必须从模拟器/ iPhone中删除该应用程序才能摆脱此错误。
尝试为表实现自定义ViewCell时遇到此错误。当我突出显示XIB的View控制器并连接到CellView中的元素时,导致错误“一旦删除这些类,该类就不是与密钥兼容的键值”,它就消除了错误。
删除下图中的连接。
只要确保您只有与Table View Cell的连接即可。要检查,请单击表格视图单元格,然后在INSPECTOR中查找您的连接。
如果它是仅iPhone应用程序,而不是通用应用程序,请确保以下字段为空:
目标>摘要> iPhone / iPod部署信息>主界面
如果您指定了xib,则会崩溃。
此错误表明已连接的Interface Builder 对象已被删除/在其所有者的源(文件的所有者)中重命名。
在界面生成器中按住Control键并单击“ 文件的所有者”,如果您看到感叹号,则需要对其进行修复。
在下面的图片中,您可以看到“ aRemovedView”在其右侧带有一个感叹号,这是因为在IBOutlet视图对象已经在IB中连接时,我将其删除了。
这将产生以下错误: 由于未捕获的异常“ NSUnknownKeyException”而终止应用程序,原因:“ [[setValue:forUndefinedKey:]:此类与密钥 aRemovedView的密钥值不兼容”。
我遇到了同样的问题,尽管TechZen的回答确实的惊人,但我发现很难将其应用于我的情况。
最终,我通过“ 对象”下列出的“控制器” (下图突出显示)而不是“ 文件所有者”链接标签来解决了该问题。。
希望这可以帮助。
就我而言,这是情节提要源代码中的错误,请按照以下步骤操作:
<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>
如您所见,这些是代码变量名称与情节提要布局xml标签之间的连接;)
IBOutlet
一次,IBOutlet
就不需要ivar标签。UIViewController
吗?在某个时候你应该打电话[SecondView initWithNibName:@"yourNibName" bundle:nil];
-initWithNibName
打错了笔尖的名字。
这仅在设备(iPhone)上调试时才发生。iOS模拟器运行正常。从Xcode进行“产品->清洁”似乎可以解决问题,但是我不知道为什么。
我有完全相同的错误消息,并感谢(!!)来自http://www.idev101.com的 Kira,我能够解决挑战。在所有这些线程上进行谷歌搜索和堆叠之后,我才找到她的网站。我现在在这里发布有关StackOverFlow的下一个文章,它具有与我相同的挑战,因为该人很可能会通过Google进入此话题。
我意识到,我做错了这个:
UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];
代替此:
DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];
哪里
DeviceViewController
我班级的名字也被称为
DeviceViewController.h
DeviceViewController.m
你必须
"import DeviceViewController.h"
在您要调用的实现(.m文件)中,例如另一个UIViewController。
如果我仅对像我这样的初学者说些显而易见的话,并且可能会因为不完全与问题相关而被否决,我绝对不会后悔,但是我现在正连续搜索4(?!?)小时来查找这些错误消息的答案。如果我可以把这个留给一两个人,那就太好了:)
PS:对于那些对代码如何继续加载另一个UIViewController感兴趣的人:
[self presentViewController:deviceViewController animated:YES completion:nil];
这可能是由于您已拖动控件并创建了出口或动作,而忘记删除了它。即使删除了代码,或者制作了足够的cmd + Z,也需要进入情节提要的连接检查器,查看您创建的操作或出口是否仍在此处。
查看其他答案,似乎有很多事情可以导致此错误。这里还有一个。
如果你
然后,您可能还会收到类似于以下内容的错误
无法在[您的自定义视图] ...上设置(xxx)用户定义的已检查属性...:此类与密钥[xxx]的编码不兼容。
解决方案是删除旧属性。
打开您的类的身份检查器,在“用户定义的运行时属性”下选择属性名称,然后按减号(-)。
当我的视图控制器最初有一个.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.'
以编程方式创建它时,解决方案可能是:
-(void)loadView {
// Ensure that we don't load an .xib file for this viewcontroller
self.view = [UIView new];
}
Identity Inspector中View Controller的“ Module”属性可能与您期望的不同。还要确保将新类添加到目标列表中。
补充一点,因为我也遇到了这个错误。仔细研究所有这些答案似乎最适用于处理UI和情节提要素材。我知道原始发布者似乎确实在使用UI,但是当寻找可能导致此错误的原因时,大多数问题都会导致该问题,而其他问题则被重复关闭,或者只是在情节提要中存在连接问题,因此我将添加我的解决方案。
我当时正在使用Swift 2编写Web服务代码。我已经构建了所有必需的代理对象和存根。当我遍历返回的XML时,我正在动态实例化我的对象,这些对象全部来自它们NSObject
并setValue:forKey
在它们上使用。每次setValue:forKey
尝试设置属性时,都会因该错误而崩溃。
对于要处理的每种类型(例如Bool?
,,)和遍历的每个XML节点CShort?
,我都有一个switch语句String?
,检查对象上的类型,然后将值转换为该类型,并尝试使用进行设置setValue:forKey
。
最终,我开始注释掉所有这些setValue:forKey
行,发现我的default
switch语句案例确实适用于String?
。
我终于弄清楚了,除非将可选的swift类型直接映射到诸如或的Objective-C 类型,否则您不能使用setValue:forKey
它们。我最终将所有类型都更改为,因为它具有直接映射。对于我来说,只使用它并将其初始化为就可以了。其他人可能没有那么奢侈。String?
NSNumber?
CShort?
NSNumber?
Bool?
Bool
false
无论如何,如此令人头疼的希望可以帮助其他有类似问题的人,并不断地转向这个问题并对自己说:“我在UI中什么也没做!!”。
因此,最后重申一遍,键值编码不适用于可选选项。在下面,我最终找到了某个地方,但我忘记了在哪里,所以我向谁张贴此文章表示歉意,如果我想起在哪里找到了它,那还是值得我功劳的:
您不能在Optional Int属性上使用KVC,因为KVC是Cocoa / Objective-C,而Objective-C无法看到Optional Int-它没有桥接到Objective-C。Objective-C只能看到桥接到Objective-C的类型:
从NSObject派生的类类型
@objc公开的类类型
桥接的Swift结构
“该类不是针对密钥的键值编码兼容”,我有点晚了,但是我的答案有所不同,所以我认为需要发布它,我以错误的方式推送了第二个控制器,这是示例
推控制器的方法错误
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];
我没有找到上述任何答案,所以可能可以帮助遇到同样问题的某个人
可能是从Xib Interface引用已重命名或删除的组件的情况。重新引用对我有用。
这个错误是另外一回事!
这是我如何解决的。我正在使用xcode版本6.1.1并使用swift。每当我的应用尝试执行搜索以跳到下一个屏幕时,我都会收到此错误。这是我做的。
干杯,
如果您有一个带有IBOutlets的自定义UIViewController子类,该子类导致了问题,那么我发现实际上消除该错误的唯一步骤是:
.1将类更改为UIViewController
.2断开所有插座的连接(现在它们都将带有黄色警告三角形)-仅断开有问题的插座就足够了。
.3执行所有标准步骤-↑⌘K,删除“派生数据”(,祈祷垫,苦恼珠)
.4启动应用程序-转到有问题的场景。
.5终止应用程序,返回到Interface Builder,将类更改回您的自定义类名称。
.6重新连接插座。
启动应用程序,这通常可以解决键值合规性问题。
就我而言,这是由于引用了错误的Nib引起的:
BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
我在情节提要中遇到此错误。上面的解决方案似乎不是问题,所以我最终删除了视图控制器,然后再次将其添加回(当然,重新连接了segue并重新分配了类),从而修复了该问题。我不知道它到底是什么,但是在此开始之前不久,我已将相关的视图控制器类重命名,所以也许这已使某些事情发生了。