首页 文章

这是什么意思? “'NSUnknownKeyException',原因:......这个类不是键值X的键值编码兼容”

提问于
浏览
1031

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

我的应用程序崩溃,出现以下错误 . 这是什么意思?我该如何解决?

***由于未捕获的异常'NSUnknownKeyException'终止应用程序,原因:'[<UIViewController 0x6e36ae0> setValue:forUndefinedKey:]:此类不是密钥值编码兼容的密钥XXX .

30 回答

  • 61

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

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

    希望它适用于某些人 .

  • 8

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

    即cmd-单击相关的UIViewController类,并仔细检查它是否包含在“Targets”选项卡中 .

  • 8

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

  • 57

    只是添加到此,因为我也得到了这个错误 . 通过所有这些答案,大多数似乎适用于使用UI和故事板的东西 . 我知道原始海报似乎确实与UI一起工作但是当搜索可能的原因导致此错误时,大多数问题都会导致回到这个问题,其他人被关闭作为重复或只是在故事板中连接事物的问题所以我会添加我的解决方案

    我正在编写Swift 2中的Web服务编码 . 我已经构建了所有需要的代理对象和存根 . 当我浏览返回的XML时,我动态地实例化了我的对象,这些对象全部来自 NSObject 并且使用了 setValue:forKey . 每当 setValue:forKey 试图设置一个属性时,它就会因为这个错误而爆炸 .

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

    最后我开始评论所有这些 setValue:forKey 行并发现我的 default switch语句案例确实适用于 String? .

    我终于想通了 can't 使用带有 setValue:forKey 的可选swift类型,除非它们直接映射到Objective-C类型,如 String?NSNumber? . 我最终将所有 CShort? 类型更改为 NSNumber? ,因为它具有直接映射 . 对于 Bool? 在我的情况下,我可以使用 Bool 并将其初始化为 false . 其他人可能没那么奢侈 .

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

    所以最后重申一次键值编码不适用于选项 . 下面我最终找到了某个地方,但我忘记了发布这个的人在哪里,我道歉并且如果我记得我发现这个但是它挽救了我的生命,我会感激不尽:

    您不能在Optional Int属性上使用KVC,因为KVC是Cocoa / Objective-C,而Objective-C看不到可选Int - 它没有桥接到Objective-C . Objective-C只能看到桥接到Objective-C的类型:从Nobbject类类派生的类类型,这些类型是用桥接的@objc Swift结构公开的

  • 15

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

  • 21

    在我的情况下 . 合并后我没有在xib文件中丢失插座 .

    Shift命令K.

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

  • 29

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

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

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

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

  • 91

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

    最终我通过下面列出的Controller链接标签解决了这个问题 Objects (在下图中突出显示)而不是通过 File Owner .

    希望这可以帮助 .

    enter image description here

  • 30

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

    我下载了你的项目 .

    你得到的错误是

    'NSUnknownKeyException',原因:'[<UIViewController 0x3927310> setValue:forUndefinedKey:]:此类不是密钥值的密钥值编码兼容 .

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

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

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

    Another possible reason for this error:

    糟糕的出口 .

    您已在.h文件中删除或重命名了插座名称 .

    在.xib或.storyboard文件的Connection Inspector中删除它 .

  • 4

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

    • 首先打开你的故事板作为源代码

    • 搜索 <connections>

    • 删除不需要的连接

    例如:

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

    如您所见,这些是您的代码变量名称和storyboard布局xml标记之间的连接;)

  • 34

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

  • 6

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

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

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

    故事的道德:重复的类文件很糟糕 .

  • 10

    enter image description here

    enter image description here

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

  • 7

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

    我意识到,我错误地做了这个:

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

    而不是这个:

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

    哪里

    DeviceViewController
    

    我的 class 的名字也被称为

    DeviceViewController.h 
    DeviceViewController.m
    

    你必须这样做

    "import DeviceViewController.h"
    

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

    如果我只是为像我这样的初学者表明显而易见的事情并且可能会因为问题与这个问题没有完全相关而得到了投票,我绝对不会后悔,但我现在正在搜索4(?!?)小时以获得这些错误消息的答案 . 如果我可以把这个放到1或2个人身上,那就太棒了:)

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

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

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

    即使我已从此项目中删除.xib文件 . 用户iPhone / iPad可能包含此viewcontroller的.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];
    }
    
  • 848

    Identity Inspector中View Controller的“Module”属性可能与您的预期不同 . 还要确保将新类添加到目标列表中 .

  • 15

    就我而言,这是由引用错误的Nib引起的:

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

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

  • 5
    • 您只需指定 IBOutlet 一次, IBOutlet 标签就不需要您的ivar .

    • 您是否使用 UIViewController 实例化您的NIB?在某些时候你应该打电话给 [SecondView initWithNibName:@"yourNibName" bundle:nil];

  • 7

    “这个类不是关键值编码兼容的密钥”我知道它有点晚但我的答案是不同的所以我认为它需要发布,我是以错误的方式推动第二个控制器,这里是样本

    推送控制器的错误方法

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

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

  • 7

    看着对方答案似乎有很多事情可以导致这个错误 . 还有一个 .

    如果你

    • 有自定义视图

    • 添加了@IBInspectable属性

    • 然后删除它

    然后你可能会得到类似的错误

    无法在[您的自定义视图]上设置(xxx)用户定义的检查属性...:此类与密钥[xxx]不符合密钥值编码 .

    解决方案是删除旧属性 .

    enter image description here

    打开您的类的Identity检查器,在User Defined Runtime Attributes下选择属性名称,然后按减号按钮( - ) .

  • 7

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

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

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

  • 5

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

    要纠正它:

    • 突出显示.m文件 .

    • 在右窗格中,选择“文件检查器” .

    • 在"Target Membership"部分下,确保选中相应的构建目标 .

    希望这有助于那里的人 .

  • 60

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

    enter image description here

  • 21

    如果你有一个自定义的UIViewController子类与IBOutlets导致问题,我发现实际摆脱错误的唯一一组步骤是

    .1将类更改为UIViewController

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

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

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

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

    .6重新连接插座 .

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

  • 40

    此错误表示已在其所有者's source (File'的所有者中已连接的Interface Builder object is removed/renamed .

    按住Control键并单击Interface Builder中的 Files's Owner ,如果看到 exclamation mark 则需要修复它 .

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

    enter image description here

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

  • 3

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

  • 1445

    它可能来自于您拖动控件并创建出口或操作,并忘记删除它 . 即使您删除了代码,或者即使您已经制作了足够的cmd Z,也需要进入故事板的连接检查器,看看您创建的操作或插座是否仍在此处 .

  • 105

    您的xib中可能连接不良 .

    在这种情况下,我的回答是完全正确的,另一个常见的原因是当你在你的.h / .m中 change the name of a IBOutlet property 时你是've already connected up to File'在笔尖中的所有者 .

    从你的笔尖:

    • 在IB中选择对象并转到'Connections Inspector' .

    • 在'Referencing Outlets'下确保您的对象仍未连接到旧属性名称...如果是, click the small 'x' to delete the reference 并再次构建 .

    example 1

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

    • 打开故事板并右键单击UIButton

    • 您将看到此按钮有多个assign / ref . 使用小“x”删除其中一个“Main ...”灰色窗口:

    example 2

  • 3

    这个错误是别的!

    这是我如何修复它 . 我正在使用xcode Version 6.1.1并使用swift . 每当我的应用程序尝试执行segue跳转到下一个屏幕时,我都会收到此错误 . 这就是我做的 .

    • 检查按钮是否连接到正确的操作 . (这不是问题,但仍然很好检查)

    • 检查按钮是否没有您可能错误创建的任何其他操作或插座 . (这不是问题,但仍然很好检查)

    • 检查日志并确保NEXT SCREEN中的所有按钮都具有正确的操作,如果有任何segues,请确保它们具有唯一标识符 . (这是问题)

    • 其中一个segue没有唯一标识符

    • 其中一个按钮有一个动作和两个我错误创建的插座 .

    • 删除任何其他插座,并确保您到下一个屏幕的segues具有唯一标识符 .

    干杯,

相关问题