Xcode - 如何修复“NSUnknownKeyException”,原因:“......此类不符合键值编码的键值 X“错误?

Xcode - How to fix 'NSUnknownKeyException', Reason: "… this class is not key value coding-compliant for the key X" error?

提问人: 提问时间:6/22/2010 最后编辑:26 revs, 16 users 36%Guillaume Dubois 更新时间:9/6/2023 访问量:1022507

问:

我正在尝试将 a 与我的班级中创建的 a 链接起来。UILabelIBOutlet

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

*** 
Terminating app due to uncaught exception
'NSUnknownKeyException', reason: 
'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]: 
this class is not key value coding-compliant for the key XXX.'

这是什么意思,我该如何解决?

iOS macOS Cocoa Cocoa-Touch 界面生成器

评论

15赞 gdm 5/24/2013
佩德罗托雷斯是对的。是的,这是对的。如果你正在执行 UITableViewCell,请记住在 IB 中将 File's Owner 设为 NSObject,将 UITableViewCell'Class 设为你定义的 .h 类。
4赞 Alex Yursha 6/4/2015
当您遇到这样的问题并且有问题的键是操作而不是出口时,那么很可能您有一个出口错误地引用了您的操作函数名称而不是出口变量名称。
2赞 kris 7/13/2015
您应该注意到,错误消息中的密钥名称(OP 将其称为“XXXX”)是您为 nib 文件中的某些内容提供的名称。这应该有助于缩小搜索范围。
0赞 jtbandes 8/2/2015
我提交了 rdar://22105925,要求苹果在构建时使这些错误更加明显。:)
1赞 Fattie 9/28/2015
如何真正立即解决问题!stackoverflow.com/a/13812660/294884 绝妙的提示

答:

34赞 kubi #1
  1. 您只需要指定一次,您的ivar标签是不必要的。IBOutletIBOutlet
  2. 您是否正在使用 ?在某些时候,您应该致电UIViewController[SecondView initWithNibName:@"yourNibName" bundle:nil];

评论

0赞 jlstrecker 10/26/2011
这很有帮助!我从不同的视图控制器收到有关属性的键值编码合规性错误。原来我用错误的笔尖名称打电话。-initWithNibName
0赞 Futur 12/12/2011
是的,这也帮助了我。我使用的是 UIViewController 而不是 MyCustomeViewController。.但这可能是一种层次结构问题。内省失败,因为未放置类对象。无论如何谢谢你
0赞 Dave Hubbard 12/9/2018
我也有类似的问题。意外出现两个相同的 IBAction 条目。没有显示在代码中,只显示在 UIControl 的右键单击中(在我的情况下是 UIStepper)。只需删除一个即可修复它。
1063赞 10 revs, 8 users 41%Hassan Tareq #2

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

我下载了你的项目。

您得到的错误是

“NSUnknownKeyException”,原因:“[<UIViewController 0x3927310> setValue:forUndefinedKey:]:此类不符合键字符串的键值编码。

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

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

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

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

糟糕的出口。

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

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

另一个可能的原因

(就我而言)使用可绑定属性扩展 UIView 并为这些可绑定属性(即阴影、拐角半径等)设置值,然后从 UIView 扩展中删除这些属性(出于某种原因),但以下内容仍保留在 xml (of ) 中:<userDefinedRuntimeAttributes>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>

溶液:右键单击> Open as Source Code,>按 keyPath(即 shadowRadius)搜索 > 删除导致问题的foo.storyboard</userDefinedRuntimeAttributes>

评论

10赞 Nirma 8/11/2011
另外,不要忘记将笔尖的“视图”出口连接到文件所有者的视图出口(从 UIViewController 继承的自定义类的视图出口)。这可以通过控制从“占位符”下的“文件所有者”拖动到“对象”下的“视图”并选择视图出口来完成。
1赞 Zennichimaro 4/3/2013
我已经确保所有类都已设置,但NSUnknownKeyException仍然:(
1赞 sudo 3/9/2014
我什至没有使用Interface Builder,我仍然收到此错误。知道这是怎么回事吗?
14赞 sudo 3/9/2014
没关系。这是因为两件事:即使 Xcode 已从项目中删除,它仍然在访问我的主故事板,并且模拟器缓存了它。我强烈建议使用故事板或 NIB——它们的问题非常严重。
7赞 The Muffin Man 5/13/2015
@Josh哈哈。每当我鼓起动力在 xcode 中创建原生应用程序时,它总是以我花一天时间试图弄清楚如何做任何事情而告终。我是一名 c# 开发人员,所以我最近一直在关注 Xamarin 和 Telerik (nativescript) 的产品。
7赞 Jason #3

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

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

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

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

12赞 David Carney #4

对于一个有两个目标(有自己的MainWindow XIB)的项目,我遇到了类似的问题。导致我出现此错误的根本问题是 UIViewController 类未包含在第二个项目的资源列表中。即接口构建器允许我在 MainWindow.xib 中指定它,但在运行时系统无法找到该类。

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

45赞 Eric Brotto #5

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

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

希望这会有所帮助。

enter image description here

3赞 Symmetric #6

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

评论

0赞 Symmetric 1/7/2012
我又收到这个错误了。这一次,我创建了一个新的空表视图控制器,并为其分配了我的类,而将非工作控制器单独保留,并将 segue 移动到它。这奏效了。然后,我慢慢地复制视图中的每个元素,直到它再次失败。这次的问题是我为选择器分配了一些“用户定义的运行时属性”(我想我可以使用它们来初始化选择器,这样我就不必在代码中完成,不知道这是否可行)。删除它解决了问题。这个错误真的很可怕,我希望它在将来的版本中得到改进!
1663赞 7 revs, 6 users 37%OhadM #7

您的 xib 可能连接不良。

我遇到过很多次这个错误。虽然 TechZen 的答案在这种情况下是绝对正确的,但另一个常见原因是当您更改 .h/.m 中 IBOutlet 属性的名称时,您已经将其连接到笔尖中的文件所有者。

从您的笔尖:

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

    enter image description here

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

  1. 打开情节提要,然后右键单击 UIButton
  2. 您将看到此按钮有多个 assign/ref。 删除“Main...”之一。带有小“X”的灰色窗口:

    example 2

评论

2赞 Mark Patterson 2/4/2014
谢谢!就我而言,我有 2 个出口到同一个视图,摆脱旧视图并将视图连接到新视图结束了异常。
0赞 aremvee 1/26/2016
我的被复制了两次。在我从 Pro 版本(从 Lite 版本)拖放后,我开始断开每个连接,以为它挂在另一个项目的连接上。当我遇到副本时,只需点击 3 次即可断开连接,我真诚地希望我早 3 天完成。哦,好吧,这就是开发人员的生活。
0赞 mythicalcoder 4/18/2016
我遇到了一个问题,UIButton 有多个分配。这解决了我的问题。
0赞 Augusto Carmo 9/19/2016
我也有这个问题。不要忘记检查特定视图中的出口连接,而不仅仅是超级视图。就我而言,超级视图没有显示错误的连接 =/
0赞 brw59 2/25/2017
我遇到了类似的错误,我将按钮插座连接到错误的 ViewController swift 文件,该文件的页面尚未使用 GUI 创建
124赞 Steve Rogers #8

我不得不从模拟器/ iPhone中删除该应用程序以摆脱此错误。

评论

2赞 SundayMonday 9/27/2012
+1 这为我解决了它。我正在清理一些使用 IB 的代码。当我从代码中删除一个按钮时,即使笔尖文件中根本没有引用此按钮(至少我可以看到),错误也会不断弹出。
2赞 Anton 5/30/2013
如果您正在调试两个碰巧具有相同名称的应用程序,我发现这是必要的。
0赞 Carlos P 7/31/2013
是的,似乎 XIB 中的某些内容缓存在模拟器上,如果您正在测试升级,这会很痛苦,因为您实际上不想删除旧应用程序。
0赞 balboa 11/26/2014
我在删除我的 XIB 文件时遇到了这个问题。这解决了问题。
5赞 Philip Fung 8/19/2015
如果删除应用程序不起作用,请尝试删除 XCode DerivedData 文件夹。这可能会缓存不正确的 xib 文件。打开 XCode -> 首选项 ->位置 -> 打开 DerivedData 文件夹并将其拖到废纸篓。
3赞 priya #9

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

68赞 erkanyildiz #10

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

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

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

评论

2赞 terriblememory 7/14/2012
是的,对我来说就是这样。在四处摆动以添加新的启动视图控制器时,我将其设置为新的类/笔尖。连接视图插座后,我遇到了此错误。清除此字段可修复它。
0赞 jimt 10/17/2012
这对我有用。请注意,我还必须从设备/模拟器中删除旧版本才能使其正常工作。
0赞 RobertJoseph 12/18/2012
谢谢 - 这是我的问题。我重命名了我的 iPad 故事板文件,但没有在我的项目首选项中更新。
2赞 snipe 8/31/2013
谢谢!这为我解决了这个问题。(在将主界面字段更改为空后,我不得不从模拟器中删除该应用程序。简单地更改该字段不会强制模拟器破坏缓存。
0赞 Justin 8/6/2015
我记得我把东西从通用应用程序更改为仅限 iphone 的应用程序,这修复了错误!
8赞 MehrozKarim #11

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

0赞 clozach #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
3赞 pedrotorres #13

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

此外,请尝试清理代码。

8赞 kubilay #14

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

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

希望它对某些人有用。

1赞 steepLearningCurve #15

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

1赞 Artem Shmatkov #16

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

0赞 Eric #17

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

如果你然后像这样显示它:

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

将显示该视图,但如果它已连接到其文件所有者,您将收到错误消息。因此,这应该起作用:IBOutlets

  1. 在父视图的代码中,声明 an 以引用子视图的 nib 文件中的视图IBOutlet UIView *mySubview
  2. 在子视图的 nib 文件中,将“文件所有者”连接到视图,并将其设置为mySubview
  3. 通过执行以下操作来显示它:
[[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil]
[self.view addSubview:mySubview];

你会没事的!

2赞 Jorge Rodrigues dos Santos #18

通过在 Storyboard/xib 界面中选择有问题的对象并打开 Connections Inspector (View->Utilities->Show Connections Inspector),检查是否有杂散的 Referencing Outlets。如果您确实删除了不需要的连接,您应该可以开始了。

64赞 Tibidabo #19

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

在界面构建器中按住 Control 键单击“文件所有者”,如果看到感叹号,则需要修复该问题。

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

enter image description here

这给出了以下错误:由于未捕获的异常“NSUnknownKeyException”而终止应用,原因:“[ setValue:forUndefinedKey:]:此类不符合键 aRemovedView 的键值编码。

评论

0赞 Ira Herman 10/1/2014
谢谢!这为我解决了它。我已经遇到这个问题很长时间了,除了从头开始之外,我不知道如何解决它。就是这样,从视图控制器中删除了 IBOutlets,但不知道它们仍然在所有者中被引用/链接(在本例中为界面构建器中的“视图控制器” - Xcode 6)。
2赞 Apple Pirate #20

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

在 Project Navigator 中,

找到笔尖 (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>
16赞 neoneye #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];
}

评论

0赞 Lewis Edward Garrett 6/30/2021
我已将我的选项卡栏应用程序从 .xibs 转换为 .storyboard 场景。当我尝试实现一个显示自定义表视图的选项卡时,它崩溃了,并显示“缺少标识符 storyboardPlaceholder 的代理”。经过几个小时的尝试修复,我找到了这篇文章。一旦我从项目中删除了原始的 .xib(现在转换为情节提要场景)文件,当选择 tableview 选项卡时,应用程序就会停止崩溃。
0赞 Li Fumin #22

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

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

例如,您选择更改 xib 文件的名称,然后 foget 将 “initWithNibName” 方法中使用的名称更改为相同的名称。

0赞 Heider Sati #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赞 Yannis #24

我有完全相同的错误消息,感谢 (!!) http://www.idev101.com 我能够解决挑战的 Kira。我只是在谷歌搜索和堆叠所有这些线程后才找到她的网站。我现在在这里发帖,为下一个来到 StackOverFlow 的人发帖,并且遇到了与我相同的挑战,因为那个人很可能会通过 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];

评论

0赞 Pittfall 10/11/2013
感谢您的所有步骤,我使用的是 Xcode 5,并且真的不知道如何手动添加笔尖,因为默认情况下您只能添加故事板......我得到了一些说明,但没有你的那么详细。真的很有帮助!!
0赞 tontonCD 5/15/2019
“我错了......”谢谢,这不是我第一次因为这个非常愚蠢的错误而花很多钱
0赞 JackieLam #25

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

32赞 Maj #26

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

评论

0赞 user3818576 1/29/2015
这解决了我的问题。tsk2x 头痛将近 3 天。
5赞 LevinsonTechnologies 4/9/2015
它确实提供了问题的答案。笔尖中有些东西搞砸了,清理解决了它。我阅读并尝试了上述所有方法,但无济于事,然后进行了清理,经过 1 小时的尝试修复,Maj 的解决方案修复了它。我很想看看XML中是什么导致了这种情况,但我已经继续前进了。
0赞 DustinB 5/12/2015
这确实解决了问题 - 我在上面尝试了许多建议,但项目只清理了这个突然开始发生的错误。呃......
0赞 Naveen Shan 12/29/2015
这解决了我的问题,我尝试了很多上述建议。看起来很奇怪!
0赞 sgvd #27

我以另一种略有不同的形式遇到了同样的错误:

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

0赞 Rickster #28

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

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

129赞 Gerard G #29

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

删除下图中的连接。Delete the connections in inspector when File Owner is highlighted

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

The connection should be in here when Table View Cell is highlighted

评论

5赞 Rogare 12/5/2014
这为我做到了,非常感谢。当在左列中选择“文件的所有者”时,我取消了连接,然后选择了我的自定义单元格并重新附加它们。成功!
0赞 lifeisfoo 12/30/2015
即使使用 xcode7 也可以使用,只需使用右侧面板“连接检查器”即可。从 tableviewcell 和标签中删除插座,然后重新添加它,一切正常。
8赞 devjme 2/27/2017
这有效,但您需要确保 FileOwner 没有被设置!!文件所有者应保留 NSObject。stackoverflow.com/questions/13793162/......
0赞 wm.p1us 8/20/2018
同样的答案救了我两次!
1赞 lee 3/31/2021
有人请告诉我 set class name to 和 direct to 和有什么不一样?File's OwnerUIView
36赞 ashack #30

enter image description here enter image description here

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

评论

0赞 Benjamin 5/11/2018
Ayyy dag nab 它...简直不敢相信我经常犯这个错误。谢谢哈哈
0赞 Kevin DiTraglia 5/25/2023
这也对我有用,但我看过的所有教程都说将文件的所有者设置为类而不是根视图。我很困惑为什么这在某些情况下有效,而在其他情况下却无效?
1赞 2 revs, 2 users 67%Deve Tester #31

就我而言,

[[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil]

是原因。

将其替换为 initWithNibName,已解决。

4赞 wspruijt #32

就我而言,这是由于引用了错误的笔尖引起的:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];

评论

1赞 kris 7/13/2015
当我重命名视图控制器的类并忘记笔尖名称也需要更改时,就会发生这种情况。由于笔尖名称只是一个字符串,因此没有编译器错误。
41赞 2 revs, 2 users 78%fareed namrouti #33

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

  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 标记之间的连接;)

6赞 Mike M. Lin #34

我有同样的症状。根本原因是我的源文件的“目标成员资格”未设置为正确的目标。我认为这意味着我的类不会被构建并包含在我的应用程序中。

要更正它,请执行以下操作:

  1. 突出显示 .m 文件。
  2. 在右窗格中,选择“文件检查器”。
  3. 在“目标成员资格”部分下,确保选中相应的生成目标。

希望这对那里的某人有所帮助。

7赞 TheRealRonDez #35

这个错误是另一回事!

这是我修复它的方法。我正在使用 xcode 版本 6.1.1 并使用 swift。每次我的应用程序尝试执行 segue 以跳转到下一个屏幕时,我都会收到此错误。这是我所做的。

  1. 检查按钮是否连接到正确的操作(这不是问题,但仍然很好检查)
  2. 检查该按钮是否没有您可能错误创建的任何其他操作或出口。(这不是问题,但仍然很好检查)
  3. 检查日志并确保“下一个屏幕”中的所有按钮都具有正确的操作,如果有任何 segue,请确保它们具有唯一标识符。(这就是问题所在)
    • 其中一个 segue 没有唯一标识符
    • 其中一个按钮有一个动作和两个出口,这是我错误地创建的。
    • 删除任何其他网点,并确保进入下一个屏幕的顺序具有唯一标识符。

干杯

1赞 Rafael Ruiz Muñoz #36

这已经发生在我身上两次了。

解决方案是重新制作整个故事板,因为我从另一个故事板复制了它(因为它几乎相同)

2赞 sysuser #37

当视图控制器类中的两个变量引用 UI 标签或其他 UI 元素并且我删除其中一个变量时,也会发生这种情况。

23赞 2 revs, 2 users 98%Suragch #38

查看其他答案,似乎有很多事情会导致此错误。这里还有一个。

如果你

  • 具有自定义视图
  • 添加了@IBInspectable属性
  • 然后后来删除了它

然后,您可能还会收到类似于以下内容的错误

无法在 [您的自定义 View] ...:此类不符合键的键值编码 [xxx]。

解决方案是删除旧属性。

enter image description here

打开类的标识检查器,在“用户定义的运行时属性”下选择属性名称,然后按减号按钮 (-)。

评论

1赞 Cinn 4/3/2019
我经常出现在这个页面上......这一次,这个解决方案成功了!但是,尽管听起来很奇怪,但要删除的旧属性实际上是在另一个ViewController上,而不是它崩溃的ViewController,我不知道为什么。
1赞 jatin #39

有时 swift 文件不会在目标中添加或删除,请转到 target-->Build 设置 -->编译源代码 -->查看是否缺少任何所需的 swift 类文件。 就我而言,由于编译中不存在 swift 源文件,应用程序崩溃了。

13赞 ercu #40

Identity Inspector 中 View Controller 的“Module”属性可能与预期不同。此外,请确保将新类添加到目标列表中。

评论

0赞 Mixaz 4/26/2016
投票,因为在我的情况下就是这样。我正在使用 Swift 和 Storyboards。当我创建一个新的构建目标(以制作构建变体)时,该应用程序在新变体中不起作用,而第一个变体工作正常。应用程序在视图控制器上崩溃,其中模块名称以某种方式从第一个目标设置为模块,而在工作视图控制器中,它是当前 - <此处的模块名称>。在这种情况下,您需要删除那里的模块名称。
0赞 2 revsVladimir Borodko #41

另一个棘手的案例:

在 IB 中,将 ViewController 添加到情节提要中,删除了其视图并将自定义类设置为“MyViewController”,以便从 MyViewController.xib 实例化视图

将 Storyboard ID 指定为相同的“MyViewController”会导致异常。

将 Storyboard ID 更改为其他名称可解决此问题。

1赞 user1760527 #42

升级到 xcode7 后,我在使用 swift 类时遇到了这个问题。通过使用 @objc 指令解决了它:

@objc(XXXViewController) 类 XXXViewController

7赞 2 revsuser123456 #43

就我而言。合并后,我在 xib 文件中没有丢失的插座。

Shift + Command + K

解决了我的问题。我清理了我的项目并重建了。

9赞 AtheistP3ace #44

只是为了补充这一点,因为我也遇到了这个错误。浏览所有这些答案似乎最适用于使用 UI 和故事板的东西。我知道原始海报似乎确实在使用 UI,但是在搜索此错误的可能原因时,大多数问题都会回到这个问题,而其他问题则作为重复项关闭,或者只是在故事板中连接事物时遇到问题,所以我将添加我的解决方案。

我当时正在用 Swift 2 编写 Web 服务。我已经构建了所有需要的代理对象和存根。当我遍历返回的 XML 时,我正在动态实例化我的对象,这些对象都来自它们并在它们上使用。每次尝试设置属性时,它都会因此错误而爆炸。NSObjectsetValue:forKeysetValue:forKey

对于我正在处理的每种类型(例如,,),我都有一个switch语句,对于我检查对象上的类型,然后将值转换为该类型并尝试将其设置为。Bool?CShort?String?setValue:forKey

最终,我开始注释掉所有这些行,并发现我的 switch 语句案例确实适用于 .setValue:forKeydefaultString?

我终于发现你不能使用可选 swift 类型,除非它们直接映射到 Objective-C 类型,如 或 .我最终将所有类型更改为,因为它具有直接映射。因为就我而言,我只需使用并将其初始化为 .其他人可能没有那么奢侈。setValue:forKeyString?NSNumber?CShort?NSNumber?Bool?Boolfalse

无论如何,这真是一件令人头疼的事情,希望这能帮助到其他有类似问题的人,并不断被重定向到这个问题并对自己说,“我没有在UI中做任何事情!

所以最后,再重申一次,键值编码不适用于可选。下面我最终找到了某个地方,但我忘记了在哪里,所以无论谁发布了这个,我都道歉,如果我记得我在哪里找到这个,我会给予赞扬,但它救了我的命:

不能在 Optional Int 属性上使用 KVC,因为 KVC 是 Cocoa / Objective-C 和 Objective-C 看不到可选 Int - 它不是 桥接到 Objective-C。Objective-C 只能看到 桥接到 Objective-C:

派生自 NSObject 的类类型

使用 @objc 公开的类类型

桥接的 Swift 结构

评论

1赞 jvarela 7/26/2019
如果你试图通过 Cocoa 绑定连接一个 Swift bool 值,你需要用 @objc 指令公开它;否则,您确实会遇到此错误。这应该是最好的答案。
2赞 Jyotsna #45

我有同样的问题。我的项目发生了这种情况,因为我更改了我的产品名称,但在接口构建器中,我的旧名称为 Module,这会导致崩溃,因此请务必检查所有 xib 模块名称是否已更改。

3赞 Avinash Jadhav #46

你可能有 UI 元素的出口,但没有 .h 文件中的 IBOutlet 属性 对于连接属性中的所有 UI 元素,请查看 outlets 及其 .h 头文件中

的相应属性。

.h 文件中可能缺少一个或多个属性条目。

1赞 mfaani #47

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

这样做没有问题。你只需要添加一个故事板的入口点,即检查你喜欢的视图控制器。否则,它将是一个灰色的场景,并给你抛出一个错误。is initial View Controller

enter image description here

9赞 2 revs, 2 users 78%Muhammad Ammad #48

“此类不符合键的键值编码” 我知道有点晚了,但我的答案不同,所以我认为它需要发布,我以错误的方式推动了第二个控制器,这是示例

推送控制器的错误方式

UIViewController* controller = [[UIViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

正确的方式

TempViewController* controller = [[TempViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

我没有找到任何像上面这样的答案,所以它可能可以帮助一些有同样问题的人

1赞 Fonix #49

当我将 UIView 链接到故事板并连接 IBOutlet 时,我遇到了这种情况,例如:

@property (strong, nonatomic) IBOutlet UIView *someView

但后来,我将 UIView 变成了一个自定义类,但忘记更改上面定义的这个 IBOutlet 的类名。这是一个奇怪的错误,因为如果自定义视图没有子视图,它不会抱怨,但是一旦有子视图,它就会显示问题中陈述的错误,但显示在其中一个子视图上,而不是实际存在问题的外部 UIView。让我删除并重新添加所有子视图以试图找到问题,而实际上与子视图无关

1赞 IanS #50

当我使用主情节提要作为启动屏幕文件时,我遇到了同样的问题。我想如果您使用故事板作为启动屏幕文件,则不应将其连接到视图控制器,因为它尚未加载。

1赞 IanS #51

出于不同的原因,我遇到了同样的问题:我使用主情节提要作为启动屏幕文件。我想如果您使用故事板作为启动屏幕文件,则不应将其连接到视图控制器,因为它尚未加载。

1赞 CommaToast #52

这可能意味着您正在尝试使用开头没有签名的排序描述符。如:

[array valueForKeyPath:@"distinctUnionOfObjects.self"]

实际上必须是:

[array valueForKeyPath:@"@distinctUnionOfObjects.self"]

2赞 IsPha #53

您可能需要删除插座,通过将 IB 绘制到 来重新创建它。H 文件。

6赞 Damo #54

如果您有一个自定义 UIViewController 子类,其中包含导致问题的 IBOutlets,我发现唯一可以真正消除错误的步骤是

.1 将类更改为 UIViewController

.2 断开所有插座(它们现在都有黄色警告三角形) - 只需断开有问题的插座就足够了。

.3 完成所有标准步骤 - ↑⌘K,删除派生数据(、祈祷垫、忧虑珠)

.4 启动应用程序 - 转到有问题的场景。

.5 终止应用程序,返回Interface Builder,将类更改回自定义类名。

.6 重新连接您的插座。

启动应用程序,这通常会解决键值合规性问题。

评论

0赞 Mizmor 4/26/2019
这在 Storyboard 编辑器中复制和粘贴场景时有效。
0赞 Edison #55

您是否未连接选取器对象?

大声笑 54 个答案,没有一个是我的解决方案。谈谈一个常见的错误。

就我而言,这是因为我的 VC 上有一个选择器对象,并且没有为其设置出口和操作。

当我只是想看看布局的外观时,我经常让按钮等处于未连接状态。但似乎你不能为选择者做到这一点。

0赞 Ahmed Elashker #56

如果您尝试观察不存在的值,请注意。

这发生在我身上,只是当我观察文本字段的“Text”属性时,而我应该观察“text”属性。

0赞 Olle Raab #57

我遇到麻烦的原因是我复制了一个故事板文件(如果我没记错的话,在 Xcode 之外),然后复制文件中的所有视图控制器都具有与原始文件中相同的对象 ID。补救措施是复制粘贴视图控制器,然后它们将获得新的对象 ID。您可以在 Identity Inspector 中查看对象 ID。

1赞 Chris Allinson #58

我遇到了同样的问题,原因是在Interface Builder中指定了一个模块(而不是将其留空)。因此,当我使用与我设置的模块不同的模块时,应用程序会崩溃:S ...希望这对其他人有所帮助,因为我的问题不是由于插座损坏或过时造成的!

0赞 Iulian Onofrei #59

确保在文件中添加自定义类(甚至为空)实现,如下所示:.m

@implementation MySubclass
@end
2赞 user1760527 #60

我在 ui 视图控制器的 storyboard 和 swift 类中遇到了这个问题。通过使用 @objc 指令解决了它:

@objc(MyViewController) class MyViewController
155赞 3 revs, 3 users 38%Shruti Thombre #61

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

enter image description here

评论

0赞 magohamote 4/11/2017
这个答案对我的一个具体案例有帮助。我必须继续处理一个具有多个目标的旧 obj-c 项目。我在 Swift 中创建了一个自定义 UITableViewCell,但遇到了同样的错误。通过启用“从目标继承”,它起作用了。谢谢!
0赞 Johan 12/22/2017
模块并不总是设置正确;例如,如果您在实际创建类之前填写类名。
0赞 MatPag 8/18/2018
我已经填写了类名,而没有在最后按“Enter”键,因此IDE没有自动检查此标志。浪费了 1 个小时。谢谢。
0赞 Pradeep Kachhawaha 9/13/2019
在 obj-c 中从未遇到过此类错误。但多亏了它解开了这个谜团。
0赞 Sergio 11/15/2019
为什么这被埋在第三页?
1赞 MBH #62

我的问题在我更改目标名称后开始。

我自己的自定义 UI 类将模块名称设置为旧目标名称。

我将目标名称更改为新名称,现在工作正常。

25赞 2095377 #63

它可能来自这样一个事实,即您控制了拖动并创建了一个出口或操作,而忘记删除它。即使你删除了代码,或者即使你已经制作了足够的 cmd+Z,你也需要进入情节提要的连接检查器,看看你创建的动作或出口是否还在这里。

评论

0赞 kunigami 1/22/2018
谢谢!我是 Xcode 上的 n00b,花了一段时间才找到流氓链接。在 Xcode 9.2 中,您可以右键单击故事板视图中的元素并选中“引用出口”。
0赞 Wes #64

就我而言,我已将 ViewController 添加到情节提要中,但我没有在设计器中为其分配情节提要 ID。一旦我给了它一个 ID,它就起作用了。

使用 Xamarin/Visual Studio 2015。

2赞 Roman Reimche #65

就我而言,ViewController.m 中 IBOutlet 的属性名称已更改,但 Storyboard 中的属性名称未更改。通过按住 ctrl 键拖动将 IBOutlet 重新引入 ViewController.m 解决了该问题。我还注意到在 XCode 中找到这种“孤儿”IBOutlet 的方法:(看图)那些不是“孤儿”的 IBOutlet 有同心圆而不是行号。

"Orphaned" IBOutlets don't have concentric circles in the line number column.

2赞 Bogdan Kobylynskyi #66

我通过做两件事解决了这个问题:

  1. 修复了视图的类引用:

  1. 重新导入所有网点:

2赞 Abhi #67

当我从笔尖手动加载视图时,我遇到了同样的错误。原来我忘了设置视图的所有者。

例如,如果您按以下方式加载视图,

 let view = Bundle.main.loadNibNamed("MyNibFileName",
                                 owner: nil,
                                 options: nil)?.first as! UIView

然后添加一个 IBOutlet,则无法引用 IBOutlet,应用程序将崩溃并出现上述错误。

修复:为视图分配所有者。

 let view = Bundle.main.loadNibNamed("MyNibFileName",
                                 owner: self,
                                 options: nil)?.first as! UIView
0赞 lee #68

我真是愚蠢的错误。所以我决定在这里分享,希望这能帮助到其他像我这样的人。

我的项目中还有另一个子模块,我命名了一个与主模块中另一个类同名的新类,我的新类没有 xib 文件(100% 通过代码),但主模块中的另一个类有 xib 文件。我认为 Xcode 将新类与主模块中的 xib 文件链接错误。

消息崩溃的原因:

this class is not key value coding-compliant for the key tableView.

1赞 spaine #69

我遇到了这个错误,该错误发生在我为表视图原型单元创建的自定义类中的所有插座上。所有输出都已正确连接到情节提要,并且 Class 字段在原型单元的标识检查器中正确命名。

删除并重新创建插座不起作用。清理构建不起作用。最终起作用的是将情节提要标识检查器中的类更改为默认的 UITableViewCell,按 Enter,然后将其更改回我的自定义类的名称。出于某种原因,这奏效了。

1赞 FranticRock #70

为了添加到这个史诗般的传奇中......

我的视图控制器上面有一个属性: @objc(TheNameOfMyViewController)

这使得所有插座都崩溃,每个插座都出现“不符合键值”错误。这只是IOS12及以下版本的问题。它在 iOS 13 上运行良好。

删除该修饰符解决了此问题。现在所有的网点都工作正常。

2赞 VoidMain #71

我也有这个问题,这是由于通过创建一个新的出口来重命名视图。情节提要中可能有旧的连接插座。

您需要做的是从情节提要中删除旧的出口。

  1. 转到情节提要。
  2. 单击“显示代码审查”按钮(上面有 <- -> 标志的按钮,就在显示/隐藏导航器的左侧)。
  3. 搜索“connections”标签。
  4. 在“connections”标记中查找“outlet”标记,并将“property”属性设置为您在 Exception 中获得的名称。
  5. 取下该插座标签。
  6. 点击“Command + B”,尽情享受吧!
5赞 Joakim Sjöstedt #72

就我而言,是指定了错误的.只需删除名称并检查即可。moduletargetmoduleInherit Module from target

enter image description here

0赞 SaadurRehman #73

我正在使用 Xamarin.IOS 创建自定义笔尖。最后,我找到了根本原因,转到 Xcode 并选择了 nib 文件,在 Interface Builder 中,选择 UIView 类并选择 Connections Inspector 并删除默认插座,如下所示。enter image description here

0赞 Kyle Venn #74

我从字面上尝试了这个线程中的每个选项。唯一能为我解决它的是更改我的自定义视图 xib 文件的名称。

我的自定义视图和 xib 具有相同的名称。重命名 xib 修复了它。

0赞 2 revsyoAlex5 #75

NSUnknownKeyException 错误

'NSUnknownKeyException', reason: this class is not key value coding-compliant for the key

当文件(例如TableViewCell.xib)与单元格类(例如TableViewCell.swift)同名时,我遇到了此错误.xib

正确的方法是:

TableViewCell.swift -> View.swift <-> View.xib
1赞 NhlanhlaNkosi #76

对我来说,我必须单击文件的 Owner 对象并导航到连接并删除有问题的连接

3赞 4 revsyoAlex5 #77

iOS 运行时错误

线程 1:“[ setValue:forUndefinedKey:]:此类不符合键 xxx 的键值编码。

在以下情况下,可能会收到此错误:

  1. .xib + UITableViewHeaderFooterView

当您使用 where show 页眉/页脚扩展并连接文件和UITableViewUITableViewHeaderFooterView.swift

  • 设置File's Owner

正确方法:

  • 改为设置为Custom ClasscontainerView
  1. 在 .xib 中查看网点。其中一些可以通过 Xcode 使用黄色解释标记进行标记。在这种情况下,只需重新设置它
0赞 Krishan Kumar #78

enter image description here

通过单击按钮删除按钮引用,然后重新创建对此按钮的引用。

0赞 mefahimrahman #79

正如@FranticRock提到的,这个线程确实是一个史诗般的传奇。

就我而言——

  1. 插座连接正确
  2. “Inherit From Target”具有适当的值,这意味着模块已正确添加

在我的情况下,导致崩溃的原因在User Defined Runtime AttributesIdentity Inspector

我有一个视图,它以某种方式具有三个属性 borderColor、borderWidth 和 cornerRadius

enter image description here

从该视图中删除这些属性解决了该问题。

0赞 younes alaoui #80

就我而言,我愚蠢地将我的 UIViewController 的访问修饰符更改为 Private,当然它无法访问它......

-1赞 Abhishek C. Gidde #81

在我的例子中,视图是 UIView,但 XIB 连接是 LottieAnimationView 类型的 IBOutlet。实际的 lottie 是 UIView 的子项。