我试图将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公开的类类型 桥接的快速结构

这个错误是另一回事!

这是我如何解决它。我使用xcode版本6.1.1和使用swift。每次我的应用程序尝试执行segue跳转到下一个屏幕时,我都得到这个错误。这是我所做的。

Checked that the button was connected to the right action.(This wasn't the problem, but still good to check) Check that the button does not have any additional actions or outlets that you may have created by mistake. (This wasn't the problem, but still good to check) Check the logs and make sure that all the buttons in the NEXT SCREEN have the correct actions, and if there are any segues, make sure that they have a unique identifier. (This was the problem) One of the segues did not have a unique identifier One of the buttons had an action and two outlets that I created by mistake. Delete any additional outlets and make sure that you the segues to the next screen have unique identifiers.

欢呼,

通常当这种情况发生在我身上时,@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

您可能需要删除出口,通过从IB绘制到. h文件来重新创建它。

还有其他问题,你可以在其他答案中看到。 我为自己创建这个错误的方式是,我从头开始一个项目,首先删除故事板的初始场景,然后将另一个项目的场景粘贴到我的故事板中。

那样做没有问题。你只需要在你的故事板中添加一个入口点,也就是检查你喜欢的任何视图控制器上的初始视图控制器。否则它将是一个灰色的场景,并向您抛出一个错误。