Xcode - 如何解决 “NSUnknownKeyException”,原因:… 此类不符合“X 密钥” 错误的键值编码标准?

我正在尝试将UILabel与在我的课程中创建的IBOutlet链接。

我的应用程序崩溃并出现以下错误。

这是什么意思?

我该如何解决?

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

答案

您的 xib 连接可能不正确。

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

从您的笔尖:

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

    例子1

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

  1. 打开情节提要,然后右键单击 UIButton
  2. 您将看到此按钮有多个分配 / 引用。用小 “x” 删除其中一个 “Main ...” 灰色窗口:

    例子2

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

我下载了您的项目。

您得到的错误是

''NSUnknownKeyException',原因:'[ setValue:forUndefinedKey:]:此类与密钥字符串的编码不兼容。

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

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

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

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

坏插座。

您已删除重命名.h文件中的插座名称。

在删除它.xib.storyboard文件的连接检查。

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

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

删除下图中的连接。 突出显示“文件所有者”时删除检查器中的连接

只要确保您只有与 Table View Cell 的连接即可。要检查,请单击表格视图单元格,然后在 INSPECTOR 中查找您的连接。

当表格视图单元格突出显示时,连接应该在此处

有时,这与您的 “从目标继承” 有关。必须设置该值。使用单个目标应用程序,您只需选择 “从目标继承” 即可。如果您有多个目标,请选择所需目标。

在此处输入图片说明

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

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

如果您指定了 xib,则会崩溃。

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

在界面生成器中按住 Control 键并单击 “ 文件的所有者” ,如果您看到感叹号 ,则需要对其进行修复。

在下面的图片中,您可以看到 “aRemovedView” 在其右侧带有感叹号,这是因为在 IBOutlet 视图对象已经在 IB 中连接时,我将其删除了。

在此处输入图片说明

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

我遇到了同样的问题,尽管 TechZen 的回答确实的惊人,但我发现很难将其应用于我的情况。

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

希望这可以帮助。

在此处输入图片说明

就我而言,这是情节提要源代码中的错误,请按照以下步骤操作:

  1. 首先打开故事板作为源代码
  2. 搜索<connections>
  3. 删除不需要的连接

例如:

<connections>
    <outlet property="mapPostsView" destination="4EV-NK-Bhn" id="ubM-Z6-mwl"/>
    <outlet property="mapView" destination="kx6-TV-oQg" id="4wY-jv-Ih6"/>
    <outlet property="sidebarButton" destination="6UH-BZ-60q" id="8Yz-5G-HpY"/>
</connections>

如您所见,这些是代码变量名称与情节提要布局 xml 标签之间的连接;)

在此处输入图片说明在此处输入图片说明

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