【问题标题】:Xcode - How to fix 'NSUnknownKeyException', reason: … this class is not key value coding-compliant for the key X" error?Xcode - 如何修复'NSUnknownKeyException',原因:......这个类不符合键X的键值编码”错误?
【发布时间】:2026-01-08 21:40:01
【问题描述】:

我正在尝试将 UILabel 与在我的班级中创建的 IBOutlet 关联起来。

我的应用程序因以下错误而崩溃。

这是什么意思?

我该如何解决?

*** 由于未捕获的异常 'NSUnknownKeyException' 导致应用程序终止,原因:'[ setValue:forUndefinedKey:]:此类不符合键 XXX 的键值编码。'

【问题讨论】:

  • pedrotorres 是对的。是的,这是正确的。如果你正在做一个 UITableViewCell,记得在 IB 中将文件的所有者设置为 NSObject,并将 UITableViewCell'Class 设置为你定义的 .h 类。
  • 当你遇到这样的问题并且有问题的关键是 action 而不是 outlet 那么你很可能有一个 outlet 错误地引用了你的 action 函数名而不是你的 outlet 变量名。
  • 您应该注意到错误消息中的键名(OP 将其称为“XXXX”)是您在 nib 文件中指定的名称。这应该有助于缩小搜索范围。
  • 我提交了 rdar://22105925 请求 Apple 在构建时使这些错误更加明显。 :)
  • 如何真正立即解决问题! *.com/a/13812660/294884 绝妙提示

标签: ios macos cocoa cocoa-touch interface-builder


【解决方案1】:
  1. 您只需指定一次IBOutlet,您的ivar 不需要IBOutlet 标签。
  2. 您是否使用UIViewController 实例化您的NIB?在某些时候你应该打电话给[SecondView initWithNibName:@"yourNibName" bundle:nil];

【讨论】:

  • 这有帮助!我从不同的视图控制器收到关于属性的键值编码合规性错误。原来我用错误的笔尖名称打电话给-initWithNibName
  • 是的,这对我也有帮助.. 我使用的是 UIViewController 而不是 MyCustomeViewController.. 但这可能是一种层次结构问题.. 由于未放置类对象,内省失败.. 谢谢反正
  • 我遇到了类似的问题。偶然发现两个相同的 IBAction 条目。未在代码中显示,仅在 UIControl 的右键单击中(在我的情况下为 UIStepper)。只需删除一个即可修复它。
【解决方案2】:

您的视图控制器可能在您的 xib 中有错误的类。

我下载了你的项目。

你得到的错误是

'NSUnknownKeyException',原因:'[ setValue:forUndefinedKey:]:这个类不符合键值编码的键字符串。'

这是由MainWindow.xib 中的Second 视图控制器具有UIViewController 类而不是SecondView 引起的。更改为正确的类可以解决问题。

顺便说一句,在 Objective-C 中使用像“字符串”这样的名称是不好的做法。它会引发运行时命名冲突。即使在一次性练习应用程序中也避免使用它们。命名冲突可能很难追踪,您不想浪费时间。

此错误的另一个可能原因:当将元素从一个控制器复制并粘贴到另一个控制器时,Xcode 会以某种方式保持与原始控制器的链接,即使在编辑此元素并将其重新链接到新控制器之后也是如此。

此错误的另一个可能原因:

坏出口。

您在.h 文件中删除重命名一个出口名称。

.xib.storyboard 文件的连接检查器中将其删除。

还有一个可能的原因

(在我的情况下)使用可绑定属性扩展 UIView 并为这些可绑定属性(即阴影、角半径等)设置值,然后从 UIView 扩展中删除这些属性(出于某种原因),但以下<userDefinedRuntimeAttributes> 保留在xml(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)搜索>删除导致问题的&lt;/userDefinedRuntimeAttributes&gt;

【讨论】:

  • 另外不要忘记将 nib 的“视图”出口连接到文件所有者的视图出口(继承自 UIViewController 的自定义类的视图出口)。这可以通过控制从“Place Holders”下的“File's Owner”拖动到“Objects”下的“view”并选择视图出口来完成。
  • 我已经确定所有的类都已经设置好了,但是 NSUnknownKeyException 仍然出现:(
  • 我什至没有使用 Interface Builder,我仍然收到此错误。知道发生了什么吗?
  • 没关系。这是因为两件事:Xcode 仍在访问我的主故事板,即使它已从项目中删除,并且模拟器已将其缓存。我强烈不推荐使用情节提要或 NIB——它们的问题非常荒谬。
  • @Josh Lol。每次我激发在 xcode 中创建本机应用程序的动力时,总是以我花一天时间试图弄清楚如何做任何事情而告终。我是一名 c# 开发人员,所以我最近一直在寻找 Xamarin 和 Telerik (nativescript) 的产品。
【解决方案3】:

我发现的另一个“不合规”问题是当我出于某种原因设法拥有一个类的两个副本时。

我在错误的副本中添加了密钥。 Interface Builder 仍然看到键并让我连接它们,但在运行时它使用的是没有新键的类的另一个副本。

为了找到哪个是“正确”的副本,我使用 XCode 的 cmd-单击其他地方的类名以跳转到正确的副本,然后我删除了未使用的坏副本(在从未使用的副本中带回我的编辑后)首先)。

故事的寓意:重复的类文件是不好的。

【讨论】:

    【解决方案4】:

    对于具有两个目标(具有自己的 MainWindow XIB)的项目,我遇到了类似的问题。对我来说导致此错误的根本问题是 UIViewController 类未包含在第二个项目的资源列表中。 IE。界面生成器允许我在 MainWindow.xib 中指定它,但在运行时系统无法找到该类。

    即cmd-单击有问题的 UIViewController 类,并仔细检查它是否包含在“目标”选项卡中。

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题,虽然 TechZen 的回答可能确实令人惊叹,但我发现它很难适用于我的情况。

      最终我通过对象下列出的控制器(在下图中突出显示)而不是通过文件所有者链接标签解决了这个问题。

      希望这会有所帮助。

      【讨论】:

        【解决方案6】:

        我在故事板中遇到了这个错误。上述解决方案似乎不是问题,所以我最终删除了视图控制器并将其重新添加(当然还重新连接了 segue 并重新分配了类),从而修复了它。我不知道它到底是什么,但在这开始前不久我已经重命名了关联的视图控制器类,所以也许这已经解决了一些问题。

        【讨论】:

        • 我又收到了这个错误。这一次,我创建了一个新的空表视图控制器,并分配了我的类,让非工作的控制器一个人呆着,并将 segue 移到它上面。这行得通。然后我慢慢地复制视图中的每个元素,直到它再次失败。这次问题原来是我为选择器分配了一些“用户定义的运行时属性”(我想我可以使用它们来初始化选择器,所以我不必在代码中这样做,不知道这是否可能)。删除它可以解决问题。这个错误真的很可怕,我希望在以后的版本中得到改进!
        【解决方案7】:

        您的 xib 中的连接可能有问题。

        我多次遇到此错误。虽然 TechZen 的回答在这种情况下是绝对正确的,但另一个常见原因是当您在 .h/.m 中更改 IBOutlet 属性的名称时,您已经连接到 nib 中的 File's Owner .

        从你的笔尖:

        1. 在 IB 中选择对象并转到“连接检查器”。
        2. 在“引用插座”下,确保您的对象仍未连接到旧属性名称...如果是,单击小“x”以删除引用并重新构建.

        如果您使用 Storyboard,另一个常见原因是,您的 UIButton 可能有多个分配(解决方案与 nib 几乎相同):

        1. 打开故事板并右键单击 UIButton
        2. 您会看到此按钮有多个分配/引用。 删除带有小“x”的“Main...”灰色窗口之一:

        【讨论】:

        • 谢谢!在我的情况下,我有 2 个出口到同一个视图,摆脱旧的并将视图连接到新的视图结束了异常。
        • 我的被复制了两次。在我从 Pro 版本(从 Lite 版本)拖放后,我开始断开每个连接,以为它挂在另一个项目中的连接上。当我遇到重复项时,需要单击 3 次才能断开连接,我真诚地希望我能在 3 天前完成。哦,这就是开发人员的生活。
        • 我遇到了 UIButton 有多个分配的问题。这解决了我的问题。
        • 我也有这个问题。不要忘记检查特定视图中的插座连接,而不仅仅是超级视图。就我而言,超级视图没有显示错误的连接 =/
        • 我有一个类似的错误,我将按钮插座连接到错误的 ViewController swift 文件,该文件的页面尚未使用 GUI 创建
        【解决方案8】:

        我必须从模拟器/iPhone 中删除该应用程序才能消除此错误。

        【讨论】:

        • +1 这为我修复了它。我正在清理一些使用 IB 的代码。当我从代码中删除一个按钮时,即使在 nib 文件中根本没有引用这个按钮(至少我可以看到),错误也会不断弹出。
        • 如果您正在调试两个碰巧同名的应用程序,我发现这是必要的。
        • 是的,XIB 中的某些内容似乎缓存在模拟器上,如果您正在测试升级,这会很痛苦,因为您实际上不想删除旧应用程序。跨度>
        • 我在删除我的 XIB 文件时遇到了这个问题。这解决了问题。
        • 如果删除应用程序不起作用,请尝试删除 XCode DerivedData 文件夹。它可以缓存不正确的 xib 文件。打开 XCode -> Preferences -> Locations -> 打开 DerivedData 文件夹并将其拖到废纸篓。
        【解决方案9】:

        我遇到了同样的问题。我确实重置了模拟器。删除和添加按钮控件。终于弄干净了。 :) 感谢堆栈溢出。我的代码如何变得正常并开始工作。

        【讨论】:

          【解决方案10】:

          如果是 iPhone 专用应用,而不是通用应用,请确保以下字段为空:

          目标 > 摘要 > iPhone/iPod 部署信息 > 主界面

          如果你在那里指定一个 xib,它会崩溃。

          【讨论】:

          • 是的,对我来说就是这样。在四处寻找新的启动视图控制器时,我将其设置为新的类/笔尖。连接视图插座后,我遇到了这个错误。清除此字段将修复它。
          • 这对我有用。请注意,我还必须从设备/模拟器中删除旧版本才能正常工作。
          • 谢谢 - 这是我的问题。我已经重命名了我的 iPad 故事板文件并且没有在我的项目的首选项中更新。
          • 谢谢!这为我解决了。 (在将 Main Interface 字段更改为空后,我不得不从模拟器中删除应用程序。只需更改该字段并不会强制模拟器破坏缓存。)
          • 我记得我把东西从一个通用应用程序更改为一个仅限 iPhone 的应用程序,这修复了错误!
          【解决方案11】:

          这可能是从您已重命名或删除的 Xib 接口引用组件的情况。重新引用对我有用。

          【讨论】:

            【解决方案12】:

            通常当这种情况发生在我身上时,@TechZen 的回答就可以解决问题。然而,昨天,我花了很长时间处理情节提要连接,却发现问题出在我的代码中。

            我有一个自定义视图控制器来处理我的故事板中的各种布局,但是其中一个布局需要一个其他布局没有使用的特殊标签。所以我创建了一个这样的子类:

            @interface MyViewControllerSubclass : MyViewController
            

            然后我在 MyViewControllerSubclass.m 中添加了一个私有属性:

            @interface MyViewController ()
            @property (weak, nonatomic) IBOutlet UILabel *crashesApp;
            @end
            

            Xcode 很高兴地允许我连接这个 IBOutlet,但每次加载视图时,应用程序都会因旧的“不符合键 'chrashesApp' 的键值对”而崩溃。

            回想起来半明显的解决方案是更改私有类别以使用正确的名称,即子类的名称

            @interface MyViewControllerSubclass ()
            @property (weak, nonatomic) IBOutlet UILabel *noMoreCrashing;
            @end
            

            【讨论】:

              【解决方案13】:

              我遇到了同样的问题。我在 XIB 文件中创建了一个 tableviewCell 并遇到了这种错误。我的问题是我将“文件所有者”类定义为我的单元格视图控制器。我只是把它拿出来并设置单元格的类(在 xib 文件上单击单元格的边框,转到右侧面板上的第三个选项卡,其中显示类选择了您的视图控制器)。

              同时尝试清理您的代码。

              【讨论】:

                【解决方案14】:

                我刚刚在我的重复项目中遇到了这个问题,并通过检查 2 个地方来解决:

                1- 确保列表中有 .m 文件 -> 项目 - 构建阶段 - 编译源
                2- 之后,转到界面生成器(可能这是仅 IB 发生的错误)并取消链接所有属性、标签、图像等......然后重新链接所有。我意识到我已经删除了一个属性,但它仍然在 IB 中链接。

                希望它对某些人有用。

                【讨论】:

                  【解决方案15】:

                  提出了同样的问题。我的解决方案是将正确的故事板值放在主故事板下拉列表中。我已重命名 mainstoryboard.storyboard,但没有重置部署信息。

                  【讨论】:

                    【解决方案16】:

                    造成这种情况的另一个原因是你声明这个属性实现为@dynamic,但是类在父类中找不到它。

                    【讨论】:

                      【解决方案17】:

                      如果您想在 Interface Builder 中的单独 XIB 文件中设计一个小的子视图,并且在 IB 中将其设置为与父视图相同的类,也会发生此问题。

                      如果你这样显示它:

                      UIViewController *vc = [[UIViewController alloc] initWithNibName:@"NameOfTheSubviewNibFile" bundle:nil];
                      [self.view addSubview:vc.view];
                      

                      视图将会出现,但如果它有IBOutlets 连接到它的文件所有者,您将收到错误消息。所以,这应该可行:

                      1. 在父视图的代码中,声明IBOutlet UIView *mySubview 以引用子视图的 nib 文件中的视图
                      2. 在子视图的nib文件中,将File Owner连接到视图,设置为mySubview
                      3. 通过做来展示它:
                      [[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil] [self.view addSubview:mySubview];

                      你会没事的!

                      【讨论】:

                        【解决方案18】:

                        通过在 Storyboard/xib 界面中选择有问题的对象并打开 Connections Inspector(View->Utilities->Show Connections Inspector)来检查您是否有杂散的引用插座。如果您确实删除了不需要的连接,那么您应该一切顺利。

                        【讨论】:

                          【解决方案19】:

                          此错误表明已连接的 Interface Builder 对象在其所有者的源(文件的所有者)中被删除/重命名

                          如果您看到感叹号,请在界面生成器中按住 Control 键并单击 Files's Owner,您需要对其进行修复。

                          在下图中你可以看到“aRemovedView”右侧有一个感叹号,那是因为我删除了 IBOutlet 视图对象,而它已经在 IB 中连接了。

                          这会产生以下错误: 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setValue:forUndefinedKey:]:此类与键的键值编码不兼容aRemovedView。”

                          【讨论】:

                          • 谢谢!这为我修好了。我遇到这个问题很久了,除了从头开始之外,我不知道如何解决它。就是这样,从视图控制器中删除了 IBOutlets,但不知道它们仍然在所有者中被引用/链接(在本例中为界面构建器中的“视图控制器” - Xcode 6)。
                          【解决方案20】:

                          我从头文件中删除了该属性。我找不到对它的任何引用,但调试错误仍在引用它。我发现 nib 文件仍然有对它的引用。我删除了引用它的块,一切都修复了。

                          在项目导航器中,

                          找到 Nib (xib) 文件。右键单击并查看源代码。我删除了以下完整部分

                          <object class="IBConnectionRecord">
                              <object class="IBCocoaTouchOutletConnection" key="connection">
                                  <string key="label">DeleteLabel</string>
                                  <reference key="source" ref="372490531"/>
                                  <reference key="destination" ref="774585933"/>
                              </object>
                              <int key="connectionID">20</int>
                          </object>
                          

                          【讨论】:

                            【解决方案21】:

                            当我的视图控制器最初有一个 .xib 文件,但现在以编程方式创建时,我会遇到这种情况。

                            即使我已经从这个项目中删除了 .xib 文件。用户 iPhone/iPad 可能包含此视图控制器的 .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];
                            }
                            

                            【讨论】:

                            • 我已将标签栏应用程序从 .xibs 转换为 .storyboard 场景。当我尝试实现一个显示自定义表格视图的选项卡时,它会因 “缺少标识符 storyboardPlaceholder 的代理” 而崩溃。经过几个小时的尝试修复,我找到了这篇文章。一旦我从项目中删除了原始的.xib(现在转换为Storyboard Scene)文件中,App会退出选中TableView选项卡时崩溃。 span>
                            【解决方案22】:

                            我发现了另一种可能导致问题的可能性。

                            当使用带有错误xib名称的“initWithNibName”方法时,也会导致这种崩溃。

                            比如你选择改变一个xib文件的名字,然后foget把“initWithNibName”方法中使用的名字改成相同的名字。

                            【讨论】:

                              【解决方案23】:

                              记得以前也遇到过类似的问题,改行解决了:

                              _vicMain = [[UIViewController alloc] initWithNibName:@"vicMainScreen" bundle:nil];
                              

                              进入:

                              #include "vicLogin_iPad.h"       // This is the H file of the class holding the code for
                                                               // processing all the IBOUtlets for the Login screen
                              .
                              .
                              .
                              
                              _vicMain = [[vicLogin_iPad alloc] initWithNibName:@"vicMainScreen" bundle:nil];
                              

                              请注意,我最初声明 UIViewController 来初始化我的 _vicMain,在使用顶部的弹出窗口后,我意识到两者都使用相同的 UIViewController。

                              作者:

                              1) 包括您的类(子视图),以及执行上述 _vicMain 的相同模块(这是一个视图控制器对象/变量),即在我的情况下它是“vicLogin_iPad.h”,并且:

                              2) 使用您的自定义构造函数来声明对象(即,您可以使用“xxx = [UIViewController alloc] ...”而不是“xxx = [vicLogin_iPad alloc] ...”。

                              问题已解决。

                              我希望这会有所帮助,因为从错误消息中确定缺少详细信息很痛苦...

                              问候 海德·萨蒂

                              【讨论】:

                                【解决方案24】:

                                我收到了完全相同的错误消息,感谢 (!!) 来自 http://www.idev101.com 的 Kira,我能够解决这个挑战。我只是在谷歌搜索和堆叠所有这些线程后才找到她的网站。我现在在这里发布下一个关于 * 的帖子,并且遇到了同样的挑战,因为那个人很可能会通过 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 (?!?) 小时来寻找答案这些错误信息。如果我能把这个留给 1 或 2 个人那就太好了:)

                                PS:对于那些对代码如何继续加载另一个 UIViewController 感兴趣的人:

                                    [self presentViewController:deviceViewController animated:YES completion:nil];
                                

                                【讨论】:

                                • 感谢那里的所有步骤,我使用的是 Xcode 5,并不真正知道如何手动添加笔尖,因为默认情况下您只能添加情节提要....我得到了一些说明,但没有和你的一样详细。真的有帮助!
                                • “我错误地做了这个......”谢谢,这不是我第一次因为这个非常愚蠢的错误而花很多钱
                                【解决方案25】:

                                在处理我的 tableview 单元格时,我遇到了相同的错误日志。我发现我的 UILabel 已经将引用出口(您可以在参考检查器中检查出来)复制到文件的所有者和我的单元格的类。当我删除对文件所有者的引用时,情况会好转。

                                【讨论】:

                                  【解决方案26】:

                                  只有在设备 (iPhone) 上调试时才会发生这种情况。 iOS 模拟器工作正常。从 Xcode 执行“Product->Clean”似乎可以解决问题,但我不知道为什么。

                                  【讨论】:

                                  • 这解决了我的问题。 tsk2x 头痛近 3 天。
                                  • 它确实提供了问题的答案。 Nib 出了点问题,清理一下就解决了。我阅读并尝试了以上所有方法均无济于事,然后进行了清理,在尝试修复它 1 小时后,Maj 的解决方案修复了它。我很想看看 XML 中是什么导致了这种情况,但我已经继续前进了。
                                  • 这确实解决了问题 - 我尝试了上面的许多建议,但项目清理修复了这个突然开始发生的错误。呜呜……
                                  • 这解决了我的问题,我尝试了很多上述建议。看起来很奇怪!
                                  【解决方案27】:

                                  我遇到了同样的错误,但形式略有不同:

                                  在界面生成器中,我有一个带有自定义子控制器的导航控制器。其类名设置正确,但是 NIB 名称(选择子控制器,转到 Attributes Inspector)设置为错误文件(基本上设置为不同目标之一)。将其重置为正确的文件名解决了这个问题。

                                  【讨论】:

                                    【解决方案28】:

                                    我也有这个问题。我已将带有 IBOutlet 的视图从一个 xib 文件复制到另一个 xib 文件。即使我删除了旧的引用并创建了一个新的引用,这个错误仍然发生。

                                    我最终重启了 xcode 来解决这个问题。

                                    【讨论】:

                                      【解决方案29】:

                                      我在尝试为表实现自定义 ViewCell 时遇到此错误。当我突出显示 XIB 的视图控制器并连接到 CellView 中的元素时,一旦我删除了这些错误,就会导致错误“此类与键的键值编码不兼容”。

                                      删除下图中的连接。

                                      只需确保您只与 Table View Cell 建立连接。要检查,请单击表格视图单元格并在 INSPECTOR 中查找您的连接。

                                      【讨论】:

                                      • 这是为我做的,非常感谢。当在左栏中选择“文件的所有者”时,我删除了连接,然后选择了我的自定义单元格并重新附加它们。成功!
                                      • 即使使用 xcode7 也可以,只需使用右侧面板“连接检查器”即可。从 tableviewcell 和标签中删除出口,然后重新添加它,一切都应该正常。
                                      • 这可行,但您需要确保 FileOwner 没有被设置!文件所有者应该保留 NSObject。 *.com/questions/13793162/…
                                      • 同样的答案救了我两次!
                                      • 有人能告诉我设置类名到File's Owner和直接到UIView有什么区别吗?
                                      【解决方案30】:

                                      我的修复与 Gerard Grundy 的类似。在使用 XIB 创建自定义 UITableViewCell 时,我错误地将自定义类名称应用于文件所有者而不是 UITableViewCell。将类应用到画布上的 UITableViewCell 并将我的 IBOutlet 属性连接到它解决了这个问题。

                                      【讨论】:

                                      • Ayyy dag nab 它...不敢相信我经常犯这个错误。谢谢大声笑
                                      最近更新 更多