Xcode-如何修复'NSUniknKeyException',原因:…此类不符合键X"错误的键值编码?

我正在尝试将UILabel与在我的类中创建的IBOutlet链接起来。

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

这是什么意思?

我怎么才能修好它?

***终止应用程序由于未捕获的异常'NSUn的KeyException',原因:'[setValue: forUnouledKey:]:此类是不是键值编码兼容的关键XXX。

993007 次浏览
  1. 你只需要指定IBOutlet一次,IBOutlet标签你的ivar是不必要的。
  2. 您是否使用UIViewController实例化您的NIB?在某些时候,您应该调用[SecondView initWithNibName:@"yourNibName" bundle:nil];

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

我下载了你的项目。

你得到的错误是

'NSUIViewController 0x3927310>setValue: forUnouledKey:]:该类与键值编码不兼容。

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

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

此错误的另一个可能原因:当将元素从一个控制器复制和粘贴到另一个控制器时,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搜索(即阴影半径)>删除导致问题的</userDefinedRuntimeAttributes>

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

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

为了找到哪个是“正确的”副本,我使用XCode的cmd单击别处的类名来跳转到正确的副本,然后我杀死了坏的未使用的副本(在先从未使用的副本中进行编辑后)。

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

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

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

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

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

希望这有帮助。

输入图片描述

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

您的xib中可能存在不良连接。

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

从你的笔尖:

  1. 在IB中选择对象并转到“连接检查器”。
  2. 在“引用出口”下,确保您的对象没有仍然连接到旧的属性名称……如果是,单击小“x”以删除引用并再次构建。

    输入图片描述

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

  1. 打开你的故事板,右键单击UIButton
  2. 您将看到此按钮有多个赋值/引用。删除其中一个带有小“x”的“Main…”灰色窗口:

    例子2

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

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

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

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

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

这可能是引用您已重命名或删除的XIBInterface中的组件的情况。

通常情况下,当这种情况发生在我身上时,@TechZen的回答会起作用。然而,昨天,我花了很长时间处理故事板连接,却发现问题出在我的代码中。

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

@interface MyViewControllerSubclass : MyViewController

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

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

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

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

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

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

也尝试清理您的代码。

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

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

希望它对一些人有用。

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

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

如果您想在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文件中,将文件所有者连接到视图,并将其设置为mySubview
  3. 通过做来展示:
[[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil][self.view addSubview:mySubview];

你会没事的!

通过在Storyboard/xib界面中选择违规对象并打开连接检查器(查看->利用->显示连接检查器)来检查您是否有杂散的引用出口。如果你确实删除了不需要的连接,你应该可以走了。

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

控制-单击界面生成器中的文件的所有者,如果您看到感叹号,您需要修复它。

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

输入图片描述

这会导致以下错误:终止应用程序由于未捕获的异常'NSUn的KeyException',原因:'[setValue: forUn的关键:]:这个类是不是键值编码兼容的键aRemvedView.'

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

在Project Navigator中,

找到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>

这种情况发生在我的视图控制器最初有一个. 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 viewcontrollerself.view = [UIView new];}

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

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

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

我记得在过去有一个类似的问题,我通过改变线路来解决它:

_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 = [vicLogin_iPad alloc] ...”代替“xxx = [UIViewController alloc] ...”。

问题解决了。

我希望这能有所帮助,因为要查明错误消息中缺乏细节是一件痛苦的事情…

问候海德尔·萨蒂

我有完全相同的错误消息,并且感谢(!!)从http://www.idev101.com开始的Kira,我能够解决这个挑战。我在谷歌搜索和堆叠所有这些线程后才找到她的网站。我现在在这里发布下一个来到StackOverFlow的帖子,并且有同样的挑战,因为那个人很可能会通过谷歌来到这个线程。

我意识到,我错了:

UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

而不是这个:

DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

哪里

DeviceViewController

我的班级的名字也被称为

DeviceViewController.hDeviceViewController.m

你必须得去

"import DeviceViewController.h"

在您要调用的实现(. m文件)中,例如另一个UIViewController。

如果我只是为像我这样的初学者陈述显而易见的事实,我绝对不会感到抱歉,因为这与问题并不完全相关,但我已经连续 (?!?) 小时寻找这些错误消息的答案。如果我能把这个留给一两个人,那就太好了:)

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

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

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

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

我有同样的错误在另一个略有不同的形式:

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

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

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

当我尝试为表实现自定义ViewCell时,我遇到了这个错误。当我突出显示XIB的View控制器并连接到CellView中的元素时,导致错误“this class is not type value-兼容key”一旦我删除了这些,它就摆脱了错误。

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

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

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

在此处输入图像描述在此处输入图片描述

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

在我的情况下,

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

这就是原因。

将其替换为是否必填初始化NibName,已解决。

在我的例子中,这是由引用错误的Nib引起的:

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

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

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

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

纠正它:

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

希望这能帮助到外面的人。

这个错误是另一回事!

这是我修复它的方法。我正在使用xcode版本6.1.1和使用swft。每次我的应用程序尝试执行继续跳转到下一个屏幕时,我都会遇到这个错误。这是我所做的。

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

干杯,

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

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

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

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

如果你

  • 有一个自定义视图
  • 添加了一个@IB检查表属性
  • 后来又删掉了

那么你也可能会得到一个类似于

在[您的自定义]上设置(xxx)用户定义的检查属性失败View]…:这个类不符合键值编码[xxx].

解决方案是删除旧属性。

在此处输入图片描述

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

有时Swift文件没有从目标中添加或删除,请转到目标-->构建设置-->编译源-->查看是否缺少任何所需的Swift类文件。在我的情况下,应用程序崩溃是由于swft源文件不存在于编译中。

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

另一个棘手的案例:

在IB中,将ViewController添加到故事板,删除其视图并将Custom Class设置为“MyViewController”,以便从MyViewController.xib实例化视图

指定同一“MyViewController”的故事板ID会导致异常。

将故事板ID更改为不同的名称可以解决问题。

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

@Objectivc(XXXViewController)类XXXViewController

在我的情况下。我在xib文件合并后没有丢失的网点。

Shift+命令+K

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

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

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

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

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

我终于发现你不能使用可选的swft类型和setValue:forKey,除非它们直接映射到像String?NSNumber?这样的Objective-C类型。我最终将所有CShort?类型更改为NSNumber?,因为它有直接映射。在我的情况下,对于Bool?,我可以只使用Bool并将其初始化为false。其他人可能没有这种奢侈。

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

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

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

派生自NSObject的类类型

使用@Objectivc公开的类类型

桥接的Swift结构

我也有同样的问题。这发生在我的项目中,因为我改变了我的产品名称,但在界面生成器中,我的旧名称是模块,这导致崩溃,所以一定要检查所有xib模块名称是否也已更改。

您可能在. h文件中拥有UI元素的出口,但没有IBOutlet属性

对于连接属性中的所有UI元素,请检查网点及其在. h头文件中的相应属性。

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

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

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

在此处输入图片描述

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

错误的方法来推动控制器

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

正确的方法

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

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

当我将UIView链接到故事板并连接IBOutlet时,就会发生这种情况:

@property (strong, nonatomic) IBOutlet UIView *someView

这是一个奇怪的错误,因为如果自定义视图没有子视图,它不会抱怨,但是一旦有子视图,它就会显示问题中陈述的错误,但在其中一个子视图上,而不是问题实际存在的外部UIView。

当我使用主故事板作为启动屏幕文件时,我遇到了同样的问题。我想如果你使用故事板作为启动屏幕文件,它不应该连接到视图控制器,因为它还没有加载。

我遇到了同样的问题,原因不同:我使用主故事板作为启动屏幕文件。我想如果你使用故事板作为启动屏幕文件,它不应该连接到视图控制器,因为它还没有加载。

这可能意味着您试图在开始时使用没有分配符号的排序描述符。如:

[array valueForKeyPath:@"distinctUnionOfObjects.self"]

它实际上必须是:

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

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

如果您有一个带有IBOutlet的自定义UIViewController子类导致问题,那么我发现实际消除错误的唯一步骤是

.1将类更改为UIViewController

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

.3做所有的标准步骤-↑的K,删除派生数据(,祈祷垫,担心珠)

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

.5关闭应用程序,返回Interface Builder将类更改回您的自定义类名。

.6重新连接你的插座。

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

您是否未连接您的选择器对象?

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

在我的情况下,这是因为我在我的VC上有一个选择器对象,并且没有为它设置出口和操作。

我经常离开按钮等未连接时,我只是想看看布局的样子。但似乎你不能这样做一个选择器。

如果你试图观察一个不存在的值,请注意。

这发生在我身上,因为我正在观察文本字段的“Text”属性,而我应该观察“text”属性。

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

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

确保在.m文件中添加自定义class'(甚至为空)实现,例如:

@implementation MySubclass@end

我在用户界面视图控制器的故事板和wift类中遇到了这个问题。通过使用@Objectivc指令解决了这个问题:

@objc(MyViewController) class MyViewController

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

在此处输入图片描述

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

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

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

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

在我的例子中,我向故事板添加了一个ViewController,但我没有在设计器中为它分配故事板ID。

使用Xamarin/Visual Studio 2015。

在我的情况下,是ViewController. m中IBOutlet的属性名称发生了变化,但Storyboard中的属性名称没有变化。通过ctrl拖动将IBOutlet重新引入ViewController. m解决了这个问题。我还注意到一种在XCode中找到这种“孤儿”IBOutlet的方法:(看图像)那些不是“孤儿”的IBOutlet有同心圆而不是行号。

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

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

  1. 重新导入所有插座:

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

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

 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

我犯了一个愚蠢的错误。所以我决定在这里分享,希望这能帮助像我这样的人。

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

认为崩溃的原因与消息:

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

我在为表格视图原型单元格创建的自定义类中的所有出口上都遇到了这个错误。这些出口都正确连接到故事板,并且在原型单元格的标识检查器中正确命名了Class字段。

删除和重新创建网点不起作用。清理构建不起作用。最终起作用的是将故事板身份检查器中的类更改为默认的UITableViewCell,点击回车键,然后将其更改回我的自定义类的名称。出于某种原因,这起作用了。

为了增加这个史诗般的故事…

我的视图控制器上面有一个属性:@Objectivc

这使得所有Outlet崩溃,每个Outlet都出现“不符合键值”错误。这仅在IOS12及更低版本上出现问题。它在iOS13上工作正常。

删除那个修改器解决了这个问题。所有的插座现在都工作正常。

我也遇到了这个问题,这是由于通过创建一个新的出口来重命名视图。您可能在故事板中有旧的连接插座。

你需要做的是从故事板中删除旧的出口。

  1. 转到故事板。
  2. 单击“Show Code Review”按钮(显示/隐藏导航器左侧的<-->标志)。
  3. 搜索“连接”标签。
  4. 在“连接”标记中查找“出口”标记,其中“属性”属性设置为您在Exception中获得的名称。
  5. 去掉那个出口标签。
  6. 点击“命令+B”,享受!

在我的例子中,是module被指定为错误的target。简单地删除module名称并检查Inherit Module from target就成功了。

在此处输入图片描述

我正在使用Xamarin.IOS创建自定义nib。最后,我找到了根本原因,转到Xcode并选择了nib文件,在Interface Builder中,选择UIView类并选择连接检查器并删除默认网点,如下所示。输入图片描述

我尝试了这个线程中的每个选项。对我来说唯一修复它的是更改我的自定义视图xib文件的名称。

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

错误信息

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

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

正确的做法是:

TableViewCell.swift -> View.swift <-> View.xib

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

线程1:"[setValue: forUn定义的键:]:这个类不符合键xxx的键值编码。"

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

  1. . xib+UITableView用户自定义视图

当您使用UITableView时,显示扩展UITableViewHeaderFooterView并与.swift文件连接的heade/页脚

  • setFile's Owner

正确方法:

  • Custom Class设置为containerView

输入图片描述

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