【问题标题】:Terminating app due to uncaught exception 'NSUnknownKeyException' [duplicate]由于未捕获的异常“NSUnknownKeyException”而终止应用程序[重复]
【发布时间】:2012-01-04 04:31:54
【问题描述】:

我正在使用教程编写一个相当简单的应用程序。我今天将应用程序复制到我的工作计算机上。昨晚它在我的笔记本电脑上运行良好,但今天我收到了这个错误。我尝试删除几乎所有代码,甚至删除了 didFinishLaunchingWithOptions 函数中的所有内容,但我仍然收到此错误。我什至没有在任何地方声明导航栏!我认为代码之外存在某种项目或文件设置是问题所在?

2011-11-22 14:39:32.294 LetsEat[15320:b603] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<LetsEatAppDelegate 0x5a824a0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key navBar.'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00fa45a9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x010f8313 objc_exception_throw + 44
    2   CoreFoundation                      0x00fa44e1 -[NSException raise] + 17
    3   Foundation                          0x0079f677 _NSSetUsingKeyValueSetter + 135
    4   Foundation                          0x0079f5e5 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 285
    5   UIKit                               0x0021b30c -[UIRuntimeOutletConnection connect] + 112
    6   CoreFoundation                      0x00f1a8cf -[NSArray makeObjectsPerformSelector:] + 239
    7   UIKit                               0x00219d23 -[UINib instantiateWithOwner:options:] + 1041
    8   UIKit                               0x0021bab7 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168
    9   UIKit                               0x0002117a -[UIApplication _loadMainNibFile] + 172
    10  UIKit                               0x00021cf4 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 291
    11  UIKit                               0x0002c617 -[UIApplication handleEvent:withNewEvent:] + 1533
    12  UIKit                               0x00024abf -[UIApplication sendEvent:] + 71
    13  UIKit                               0x00029f2e _UIApplicationHandleEvent + 7576
    14  GraphicsServices                    0x011dd992 PurpleEventCallback + 1550
    15  CoreFoundation                      0x00f85944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    16  CoreFoundation                      0x00ee5cf7 __CFRunLoopDoSource1 + 215
    17  CoreFoundation                      0x00ee2f83 __CFRunLoopRun + 979
    18  CoreFoundation                      0x00ee2840 CFRunLoopRunSpecific + 208
    19  CoreFoundation                      0x00ee2761 CFRunLoopRunInMode + 97
    20  UIKit                               0x000217d2 -[UIApplication _run] + 623
    21  UIKit                               0x0002dc93 UIApplicationMain + 1160
    22  LetsEat                             0x00001c99 main + 121
    23  LetsEat                             0x00001c15 start + 53
)
terminate called throwing an exceptionCurrent language:  auto; currently objective-c
(gdb)

编辑:这是我的 delegate.m 文件的顶部。如您所见,这都是样板:

#import "LetsEatAppDelegate.h"
//#import "ItemsViewController.h"

@implementation LetsEatAppDelegate

@synthesize window = _window;
@synthesize managedObjectContext = __managedObjectContext;
@synthesize managedObjectModel = __managedObjectModel;
@synthesize persistentStoreCoordinator = __persistentStoreCoordinator;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];
    return YES;
} 

我删除了项目中的所有其他文件,但仍然出现此错误。

编辑 2

就目前而言,我只在我的工作机器上收到此错误。完全相同的文件在我的家用笔记本电脑上完美运行。相同版本的 XCode (4.2.1)

【问题讨论】:

    标签: iphone xcode


    【解决方案1】:

    重置内容和设置无效。

    这就是我浪费了 2 个小时的深夜时间:

    我已将界面构建器中的 UIControl 插座连接到 xib 所有者中的 IBOutlet。出于某种原因,IBOutlet 已从所有者中删除,但对插座的引用仍然悬在 xib 中。这总是会给我错误

    "Terminating app due to uncaught exception 'NSUnknownKeyException'"
    

    经验教训:在实现中删除 vars 的任何 outlet 时,请确保在 IB 中解开相应的连接

    更新:(2015 年 1 月 26 日)

    Interface Builder 或 nib 以这种方式运行是有充分理由的,我今天意识到了原因。

    如果您在 TheBaseClass 中有一个 IBOutlet,并且您在故事板中有一个 TheSubClass 的 nib 或场景,则有两种方法(黑客)可供您连接此插座:

    1. 在 Identity Inspector 下,将“Custom Class”标识符命名为 TheBaseClass,连接插座,然后将“Custom Class”部分中的 Class name 设置为 TheSubclass

    2. 在 TheSubclass 代码中添加 IBOutlet,将其连接到 nib 中的 ui 元素,在 TheBaseClass 中添加 IBOutlet 代码,在 TheSubClass 中删除该代码

    当我遇到这个answer 时,它就到位了,至于为什么 Apple 会让这个悬而未决的参考问题保持原样。因为,这不是错误。这是一项功能。

    【讨论】:

    • 我学到的教训是:不要使用 IB。
    • 同意,IB 没有那么成熟,现在也没有。但它肯定比 2 年前好上亿倍。 XCode5 IB 特性会让不使用 IB 变得更加困难,因为它太棒了。已经从仅程序化开发转向基于 IB 的开发,并且仍然坚信它:)
    • 你是我的救星!作为一名 Android 开发人员,我刚开始尝试 iOS 开发,过去 4 个小时都在困扰着我!
    【解决方案2】:

    已修复 - 转到 iOS 模拟器 > 重置内容和设置

    【讨论】:

      【解决方案3】:

      我遇到了这个问题,发现我设置了“主界面”并导致了问题。

      要更改此设置,请单击您的项目(在左侧文件浏览器中)。中心区域现在应该显示项目设置的“摘要”。这是您更改 iOS 应用程序目标或支持的设备方向的同一区域。在“iPhone/iPod 部署信息”部分下,清除“主界面”下拉菜单,将其留空。这为我解决了这个问题。

      祝你好运。

      【讨论】:

      • 这在我开发 Ionic / Cordova 应用程序时帮助了我。清除主界面的值立即修复它。该错误不是很能描述问题。
      • 我也在使用 ionic 并且出于某种原因我设置了主界面,在浪费了几个小时后发现了这个谢谢@newz2000
      • Cordova/Ionic2 应用程序对我来说也是如此。我之前自己设置的。
      【解决方案4】:

      问题出在您的 nib 文件中。从LetsEatAppDelegate 到导航栏有一个旧连接。

      我不确定您的应用是如何设置的,您的一个 nib 文件中可能有一个 LetsEatAppDelegate 对象,或者可能有一个文件所有者的类设置为 LetsEatAppDelegate

      4   Foundation                          0x0079f5e5 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 285
      5   UIKit                               0x0021b30c -[UIRuntimeOutletConnection connect] + 112
      6   CoreFoundation                      0x00f1a8cf -[NSArray makeObjectsPerformSelector:] + 239
      7   UIKit                               0x00219d23 -[UINib instantiateWithOwner:options:] + 1041
      8   UIKit                               0x0021bab7 -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 168
      
      
      2011-11-22 14:39:32.294 LetsEat[15320:b603] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<LetsEatAppDelegate 0x5a824a0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key navBar.'
      *** Call stack at first throw:
      

      【讨论】:

      • 有趣的是,这基本上是一个全新的项目,基于窗口的应用程序。我绝对从未创建过导航栏,并且我进行了搜索,但在我的项目中的任何地方都找不到导航栏的提及。
      • 尝试在界面构建器中打开相关的 xib,右键单击文件的所有者,然后检查那里的悬空连接。这有时也发生在我身上......
      • @Warkst 感谢您澄清这一点。 @Jon 旧连接=悬空连接
      • 所以我回家尝试了,我使用完全相同的代码没有错误,两者都使用 XCode 4.x(必须检查工作版本,我在 4.2 .1 在家里)。
      • 我现在在家工作4.2.1。今天早上我成功地在家里运行了这个项目,开始工作,但它仍然因这个错误而崩溃。完全相同的文件,完全相同的 XCode 版本。
      【解决方案5】:

      哦,伙计。删除 @properties 和/或 IBActions 后我遇到了同样的问题,这让我发疯了! Warkst 在钱上是对的。转到问题视图控制器,单击橙色球并取消选择您找到的任何悬空引用。您可能需要向下滚动才能找到它们。这解决了我的问题。太感谢了。

      【讨论】:

        【解决方案6】:

        清除“主界面”也为我解决了这个问题。您可能需要在清除“主界面”之后和构建之前执行“清理”。

        【讨论】:

        • 但是为什么会导致这个问题呢?这没有任何意义。
        【解决方案7】:

        我也遇到这个问题,

        1.在AppDelegate方法中

        -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
        

        rootViewController是通过initWithNibName方法初始化的.....但实际上nib文件不存在,所以抛出异常..

        2.viewController 加载视图时崩溃

        我想可能是因为我删除了 xib 文件,然后视图控制器仍然使用 nib 文件初始化..所以我添加了 -(void)load 视图方法。现在可以了..ps:我重置了模拟器,但它不起作用。

        希望对您有所帮助。

        【讨论】:

          【解决方案8】:

          我最近遇到了同样的问题。我所有的插座连接都很好。我终于通过对项目进行体面的清洁来做到这一点。 感谢@Robert Wohnoutka 和这篇文章:How to Delete Derived Data and Clean Project in Xcode 5 and Xcode 6?

          【讨论】:

            猜你喜欢
            • 2013-06-17
            • 1970-01-01
            • 1970-01-01
            • 2012-06-01
            • 2016-08-20
            • 1970-01-01
            • 1970-01-01
            • 2017-11-08
            • 1970-01-01
            相关资源
            最近更新 更多