我试图将UILabel与在类中创建的IBOutlet链接起来。
我的应用程序崩溃与以下错误。
这是什么意思?
我该怎么解决呢?
***终止应用由于未捕获异常'NSUnknownKeyException',原因:'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]:这个类不是键值编码兼容的键XXX。'
我试图将UILabel与在类中创建的IBOutlet链接起来。
我的应用程序崩溃与以下错误。
这是什么意思?
我该怎么解决呢?
***终止应用由于未捕获异常'NSUnknownKeyException',原因:'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]:这个类不是键值编码兼容的键XXX。'
当前回答
再加上这个,因为我也得到了这个错误。所有这些答案似乎都适用于处理UI和故事板之类的东西。我知道原来的海报似乎与用户界面工作,但当搜索这个错误的可能原因时,大多数问题都指向这个问题,其他问题被关闭为重复或简单地有问题,连接在一个故事板的东西,所以我将添加我的解决方案。
我当时正在编写Swift 2的web服务代码。我已经构建了所有需要的代理对象和存根。当我循环通过返回的XML,我是动态实例化我的对象,这都来自NSObject和使用setValue:forKey对他们。每次setValue:forKey试图设置一个属性时,都会出现这个错误。
对于我处理的每种类型,我都有一个switch语句(例如Bool?, CShort ?),对于每个XML节点,我检查了对象上的类型,然后将值转换为该类型,并尝试使用setValue:forKey设置它。
最终,我开始注释掉所有这些setValue:forKey行,并发现我的默认开关语句情况下对字符串有效。
我终于明白,你不能使用可选的swift类型setValue:forKey,除非他们有一个直接映射到Objective-C类型如字符串?还是NSNumber ?。我最终改变了所有的CShort?类型到NSNumber?因为它有一个直接的映射。Bool吗?在我的例子中,使用Bool值并将其初始化为false就可以了。其他人可能没有这种奢侈。
不管怎样,这是多么令人头痛的问题,希望这能帮助那些有类似问题的人,并不断被重定向到这个问题,并对自己说,“我没有在UI中做任何事情!!”
最后重申一次键值编码不适用于可选选项。下面我最终找到了一个地方,但我忘记了在哪里,所以我向张贴这篇文章的人道歉,如果我记得我在哪里找到了这篇文章,我会称赞它,但它救了我的命:
你不能在可选的Int属性上使用KVC,因为KVC是Cocoa / Objective-C和Objective-C不能看到可选Int,它不是 桥接到Objective-C。Objective-C只能看到 桥接到Objective-C: 从NSObject派生的类类型 使用@objc公开的类类型 桥接的快速结构
其他回答
我在为表视图原型单元创建的自定义类的所有出口上都遇到了这个错误。出口都正确地连接到故事板,并且Class字段在原型单元格的标识检查器中被正确地命名。
删除和重新创建出口都不起作用。清理构建没有起作用。最后有效的方法是将故事板标识检查器中的Class更改为默认的UITableViewCell,点击Enter,然后将其更改为自定义类的名称。出于某种原因,这奏效了。
这可能是引用已重命名或删除的Xib Interface组件的情况。重新引用对我来说很有用。
另一个棘手的例子:
在IB中,将ViewController添加到storyboard,删除它的视图,并将自定义类设置为“MyViewController”,以便从MyViewController.xib实例化视图
将Storyboard ID指定为相同的“MyViewController”会导致异常。
将故事板ID更改为其他名称可以解决该问题。
我收到了完全相同的错误信息,感谢http://www.idev101.com的Kira,我能够解决这个挑战。我是在谷歌搜索了所有这些线索后才找到她的网站的。我现在在这里发布下一个来到StackOverFlow的帖子,并且有同样的挑战,因为那个人最有可能通过谷歌来到这个线程。
我意识到,我错了:
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];
你的视图控制器可能在xib中有错误的类。
我下载了你的项目。
你得到的错误是
'NSUnknownKeyException',原因:'[<UIViewController 0x3927310> setValue:forUndefinedKey:]:这个类不是键值编码兼容的键字符串。'
这是由主窗口中的第二个视图控制器引起的。xib有一个UIViewController类而不是SecondView。更改到正确的类可以解决这个问题。
顺便说一下,在Objective-C中使用"string"这样的名字是不好的做法。它会引起运行时命名冲突。即使是在一次性练习应用程序中也要避免使用它们。命名冲突很难追踪,你不想浪费时间。
这个错误的另一个可能的原因是:当从一个控制器复制和粘贴元素到另一个控制器时,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。删除导致问题的</userDefinedRuntimeAttributes