我试图将UILabel与在类中创建的IBOutlet链接起来。
我的应用程序崩溃与以下错误。
这是什么意思?
我该怎么解决呢?
***终止应用由于未捕获异常'NSUnknownKeyException',原因:'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]:这个类不是键值编码兼容的键XXX。'
我试图将UILabel与在类中创建的IBOutlet链接起来。
我的应用程序崩溃与以下错误。
这是什么意思?
我该怎么解决呢?
***终止应用由于未捕获异常'NSUnknownKeyException',原因:'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]:这个类不是键值编码兼容的键XXX。'
当前回答
我也遇到过同样的问题,虽然TechZen的答案可能确实令人惊讶,但我发现它很难适用于我的情况。
最终,我解决了这个问题,通过对象下列出的控制器(下图中突出显示)链接标签,而不是通过文件所有者。
希望这能有所帮助。
其他回答
再加上这个,因为我也得到了这个错误。所有这些答案似乎都适用于处理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公开的类类型 桥接的快速结构
我也有同样的问题。我重置了模拟器。删除和添加按钮控件。终于搞干净了。:)由于堆栈溢出。不知怎么的,我的代码变得很好,开始工作。
通常当这种情况发生在我身上时,@TechZen的回答很管用。然而,昨天我花了很长时间处理故事板连接,却发现问题出在我的代码上。
我有一个自定义视图控制器来处理故事板中的各种布局,但其中一个布局需要一个其他布局不使用的特殊标签。所以我创建了一个子类,像这样:
@interface MyViewControllerSubclass : MyViewController
然后我在MyViewControllerSubclass.m中添加了一个私有属性:
@interface MyViewController ()
@property (weak, nonatomic) IBOutlet UILabel *crashesApp;
@end
Xcode很高兴地允许我连接这个IBOutlet,但每次视图加载时,应用程序都会崩溃,因为旧的“不key-value兼容键'chrashesApp'”。
解决方案,回顾起来是半明显的,就是改变私有类别以使用正确的名称,即子类的名称:
@interface MyViewControllerSubclass ()
@property (weak, nonatomic) IBOutlet UILabel *noMoreCrashing;
@end
你的视图控制器可能在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
此错误指示已经连接的接口构建器对象在其所有者的源(文件的所有者)中被删除/重命名。
如果你看到一个感叹号,请在界面构建器中控制单击文件的所有者,你需要修复它。
在下图中,你可以看到“aRemovedView”在其右侧有一个感叹号,这是因为我删除了IBOutlet视图对象,而它已经在IB中连接。
这将给出以下错误: 终止应用程序由于未捕获异常'NSUnknownKeyException',原因:'[setValue:forUndefinedKey:]:这个类不是键值编码兼容键aRemovedView。'