Ios Xcode-如何修复';NSUnknownKeyException';,原因:…;此类不符合密钥X的键值编码;错误?

Ios Xcode-如何修复';NSUnknownKeyException';,原因:…;此类不符合密钥X的键值编码;错误?,ios,macos,cocoa,cocoa-touch,interface-builder,Ios,Macos,Cocoa,Cocoa Touch,Interface Builder,我正在尝试将UILabel与类中创建的IBOutlet链接 我的应用程序因以下错误而崩溃 这是什么意思 我怎样才能修好它 ***由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setValue:forUndefinedKey:]:此类不符合密钥XXX的键值编码。” 您只需指定IBOutlet一次,您的ivar不需要IBOutlet标签 您是否正在使用UIViewController实例化NIB?在某个时候,您应该调用[SecondView initWith

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

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

这是什么意思

我怎样才能修好它

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

  • 您只需指定
    IBOutlet
    一次,您的ivar不需要
    IBOutlet
    标签
  • 您是否正在使用
    UIViewController
    实例化NIB?在某个时候,您应该调用
    [SecondView initWithNibName:@“yourNibName”bundle:nil]
  • 您的视图控制器可能在xib中具有错误的类。 我下载了你的项目

    您得到的错误是

    “NSUnknownKeyException”,原因:“[setValue:forUndefinedKey:]:此类不符合密钥字符串的键值编码。”

    这是由
    main窗口中的
    Second
    视图控制器引起的。xib
    具有
    UIViewController
    类,而不是
    SecondView
    。更改为正确的类可以解决此问题

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

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

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

    坏的出口

    您已经删除或重命名了
    .h
    文件中的一个插座名称

    .xib
    .storyboard
    文件的连接检查器中删除它

    还有一个可能的原因

    (在我的例子中)使用可绑定属性扩展UIView,并设置这些可绑定属性的值(即阴影、角半径等),然后从UIView扩展中删除这些属性(出于某种原因),但以下
    仍保留在xml中(属于
    foo.storyboard
    ):

    
    
    解决方案:右键单击
    foo.storyboard
    >作为源代码打开>按键路径搜索(即阴影半径)>删除导致问题的
    ,我发现的另一个“不符合”问题是,由于某种原因,我设法获得了一个类的两个副本

    我把钥匙加错了。Interface Builder仍然可以看到这些键,并让我连接到它们,但在运行时它使用的是没有新键的类的另一个副本

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


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

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


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

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

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

    希望这有帮助


    我在故事板上遇到了这个错误。上面的解决方案似乎不是问题所在,所以我最终删除了视图控制器,并再次添加了它(当然还重新连接了segue并重新分配了类),从而修复了它。我不知道它到底是什么,但在开始之前不久,我已重命名了关联的view controller类,因此,可能这导致了某些问题。

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

    从您的笔尖:

  • 在IB中选择对象并转到“连接检查器”
  • 在“引用插座”下,确保您的对象尚未连接到旧的属性名称。。。如果是,请单击小“x”删除引用并重新生成

  • 另一个常见原因是,如果您正在使用故事板,您的UIButton可能有多个赋值(解决方案与nib几乎相同):

  • 打开情节提要并右键单击UIB按钮
  • 您将看到此按钮有多个assign/ref。 移除其中一个带有小“x”的“主…”灰色窗口:


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

    我也遇到了同样的问题。我重新设置了模拟器。删除和添加按钮控件。并最终做出了一个干净的决定。:)多亏了堆栈溢出。我的代码如何变得正常并开始工作

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

    目标>摘要>iPhone/iPod部署信息>主界面
    <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>
    
    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];
    }
    
    UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];
    
    DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];
    
    DeviceViewController
    
    DeviceViewController.h 
    DeviceViewController.m
    
    "import DeviceViewController.h"
    
        [self presentViewController:deviceViewController animated:YES completion:nil];
    
    BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
    
    <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>
    
    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];