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

Posted

技术标签:

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

我正在尝试将 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 绝妙提示 【参考方案1】:

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

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

从你的笔尖:

    在 IB 中选择对象并转到“Connections Inspector”。

    在“引用插座”下,确保您的对象尚未连接到旧属性名称...如果是,单击小“x”以删除引用并重新构建.

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

    打开故事板并右键单击 UIButton

    您会看到此按钮有多个分配/引用。 删除带有小“x”的“Main...”灰色窗口之一:

【讨论】:

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

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

【讨论】:

这个答案帮助了我一个特定的案例。我必须继续处理具有多个目标的旧 obj-c 项目。我在 Swift 中创建了一个自定义 UITableViewCell 并且我遇到了同样的错误。通过启用“从目标继承”它起作用了。谢谢! 模块并不总是设置正确;例如如果在实际创建类之前填写类名。 我填写了类名,最后没有按“Enter”键,所以 IDE 没有自动检查这个标志。浪费了1个小时。谢谢。 从未在 obj-c 中遇到过此类错误。但感谢它解决了这个谜。 为什么会出现在第三页?【参考方案4】:

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

删除下图中的连接。

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

【讨论】:

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

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

【讨论】:

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

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

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

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

【讨论】:

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

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

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

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

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

【讨论】:

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

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

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

希望这会有所帮助。

【讨论】:

【参考方案9】:

在我的情况下,这是故事板源代码中的错误,请按照下列步骤操作:

    首先打开你的故事板作为源代码 搜索&lt;connections&gt; 删除不需要的连接

例如:

<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 标记之间的联系;)

【讨论】:

【参考方案10】:

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

【讨论】:

Ayyy dag nab 它...不敢相信我经常犯这个错误。谢谢大声笑【参考方案11】:
    您只需指定一次IBOutlet,您的ivar 不需要IBOutlet 标签。 您是否使用UIViewController 实例化您的NIB?在某些时候你应该打电话给[SecondView initWithNibName:@"yourNibName" bundle:nil];

【讨论】:

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

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

【讨论】:

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

我收到了完全相同的错误消息,感谢 (!!) 来自 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,并不真正知道如何手动添加笔尖,因为默认情况下您只能添加情节提要....我得到了一些说明,但没有和你的一样详细。真的有帮助! “我错误地做了这个......”谢谢,这不是我第一次因为这个非常愚蠢的错误而花很多钱【参考方案14】:

这可能是因为您已经控制拖动并创建了一个出口或动作,但忘记删除它。即使你删除了代码,或者即使你已经做了足够的 cmd+Z,你也需要进入你的故事板的连接检查器,看看你创建的动作或插座是否仍然存在。

【讨论】:

谢谢!我是 Xcode 上的 n00b,我花了一段时间才找到流氓链接。在 Xcode 9.2 中,您可以右键单击情节提要视图中的元素并检查“引用出口”。【参考方案15】:

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

如果你

拥有自定义视图 添加了@IBInspectable 属性 后来又删了

那么你也可能会得到类似

的错误

无法在 [Your Custom] 上设置 (xxx) 用户定义的检查属性 视图] ...:这个类不符合键的键值编码 [xxx]。

解决方法是删除旧属性。

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

【讨论】:

我经常出现在这个页面上......这次这个解决方案成功了!但是听起来很奇怪,要删除的旧属性实际上是在另一个 ViewController 上而不是从它崩溃的那个上,我不知道为什么。【参考方案16】:

当我的视图控制器最初有一个 .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> 【参考方案17】:

身份检查器中视图控制器的“模块”属性可能与您的预期不同。还要确保将新类添加到您的目标列表中。

【讨论】:

投票赞成,因为在我的情况下是如此。我正在使用 Swift 和 Storyboards。当我创建一个新的构建目标(制作一个构建变体)时,应用程序在新变体中无法运行,而第一个运行正常。该应用程序在视图控制器上崩溃,其中模块名称以某种方式从第一个目标设置为模块,而在工作视图控制器中它是 Current - 。在这种情况下,您需要删除那里的模块名称。【参考方案18】:

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

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

【讨论】:

【参考方案19】:

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

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

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

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

我终于发现你不能setValue:forKey 中使用可选的 swift 类型,除非它们直接映射到像 String?NSNumber? 这样的 Objective-C 类型。我最终将所有CShort? 类型更改为NSNumber?,因为它具有直接映射。对于Bool?,就我而言,只需使用Bool并将其初始化为false就可以了。其他人可能没有那么奢侈。

无论如何,这是多么令人头疼的事情,希望这可以帮助遇到类似问题并不断被重定向到这个问题并自言自语的其他人,“我没有在 UI 中做任何事情!”。

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

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

从 NSObject 派生的类类型

使用@objc 公开的类类型

桥接的 Swift 结构

【讨论】:

如果你试图通过 Cocoa 绑定来连接一个 Swift 的 bool 值,你需要使用 @objc 指令来暴露它;否则你确实会得到这个错误。这应该是最好的答案。【参考方案20】:

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

错误的控制器推送方式

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];

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

【讨论】:

【参考方案21】:

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

【讨论】:

【参考方案22】:

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

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

希望它对某些人有用。

【讨论】:

【参考方案23】:

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

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

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

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

【讨论】:

【参考方案24】:

这个错误是别的!

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

    检查按钮是否连接到正确的操作。(这不是问题,但仍然可以检查) 检查按钮是否没有您可能错误创建的任何其他操作或出口。 (这不是问题,但仍然可以检查) 检查日志并确保 NEXT SCREEN 中的所有按钮都具有正确的操作,如果有任何转义,请确保它们具有唯一标识符。 (这是问题) 其中一个 segue 没有唯一标识符 其中一个按钮有一个动作和两个出口,这是我错误地创建的。 删除所有额外的出口,并确保您转到下一个屏幕的部分具有唯一标识符。

干杯,

【讨论】:

【参考方案25】:

就我而言。合并后我没有在 xib 文件中丢失出口。

Shift + Command + K

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

【讨论】:

【参考方案26】:

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

纠正它:

    突出显示您的 .m 文件。 在右侧窗格中,选择文件检查器。 在“Target Membership”部分下,确保选中了适当的构建目标。

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

【讨论】:

【参考方案27】:

如果您有一个带有导致问题的 IBOutlets 的自定义 UIViewController 子类,那么我发现真正摆脱错误的唯一步骤是

.1 将类更改为 UIViewController

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

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

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

.5 终止应用,返回 Interface Builder 将类改回您的自定义类名。

.6 重新连接您的插座。

启动应用程序,这通常会清除键值合规问题。

【讨论】:

这在 Storyboard 编辑器中复制和粘贴场景时有效。【参考方案28】:

就我而言,这是由于引用了错误的 Nib 造成的:

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

【讨论】:

当我重命名视图控制器的类并忘记 nib 名称也需要更改时发生在我身上。由于 nib 名称只是一个字符串,因此没有编译器错误。【参考方案29】:

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

【讨论】:

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

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

【讨论】:

以上是关于Xcode - 如何修复'NSUnknownKeyException',原因:......这个类不符合键X的键值编码”错误?的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 7.0.1 - 无效的 Swift 支持 - cocoapods 如何修复?

如何修复 xcode 苹果配置的“丢失私钥”?

如何在重新启动 xcode 7.1 时修复丢失的约束

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

如何修复为啥在 Xcode 中 ScrollView 后面有状态栏空间?

如何修复 Xcode 版本 11.0 测试版画布崩溃?