我试图将UILabel与在类中创建的IBOutlet链接起来。
我的应用程序崩溃与以下错误。
这是什么意思?
我该怎么解决呢?
***终止应用由于未捕获异常'NSUnknownKeyException',原因:'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]:这个类不是键值编码兼容的键XXX。'
我试图将UILabel与在类中创建的IBOutlet链接起来。
我的应用程序崩溃与以下错误。
这是什么意思?
我该怎么解决呢?
***终止应用由于未捕获异常'NSUnknownKeyException',原因:'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]:这个类不是键值编码兼容的键XXX。'
当前回答
我发现的另一个“不兼容”问题是当我出于某种原因设法拥有两个类副本时。
我给错误的副本加了密钥。Interface Builder仍然看到键,并让我连接到它们,但在运行时,它正在使用没有新键的类的另一个副本。
为了找到“正确”的副本,我使用XCode的cmd-点击类名跳转到正确的副本,然后我杀死了不好的未使用的副本(先从未使用的副本中带来我的编辑)。
这个故事的寓意:重复的类文件是不好的。
其他回答
再加上这个,因为我也得到了这个错误。所有这些答案似乎都适用于处理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公开的类类型 桥接的快速结构
选择器对象是否未连接?
哈哈,54个答案,没有一个是我的解决方案。谈论一个常见的错误。
在我的情况下,这是因为我在我的VC上有一个选择器对象,并没有为它设置一个出口和动作。
当我只是想看看布局如何时,我经常不连接按钮等。但对于采摘者来说,你似乎做不到这一点。
如果你有一个带有iboutlet的自定义UIViewController子类,它会导致问题,我发现唯一能消除错误的步骤是
1 .修改类为UIViewController
断开所有的插座(它们现在都有黄色警告三角形)-仅仅断开有问题的插座可能就足够了。
.3执行所有标准步骤-↑⌘K,删除派生数据(,祈祷垫,担忧珠)
.4启动应用程序-进入有问题的场景。
.5关闭应用程序,返回接口生成器,将类更改为自定义类名。
6重新连接电源插座。
启动应用程序&这通常会清除键值遵从性问题。
对于我来说,我必须单击文件的Owner对象并导航到连接并删除有问题的连接
您可能需要删除出口,通过从IB绘制到. h文件来重新创建它。