因未捕获异常 'NSUnknownKeyException' 而终止应用程序

24
我正在使用一个教程来编写一个相当简单的应用程序。我今天将应用程序复制到我的工作电脑上。昨晚在我的笔记本电脑上它完美地运作,但今天我得到了这个错误。我试图削减几乎所有的代码,甚至删除了didFinishLaunchingWithOptions函数中的所有内容,但我仍然得到这个错误。我甚至没有在任何地方声明过 navBar!我认为问题在于代码之外的某种项目或文件设置?
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),完全相同的文件在我的家用笔记本电脑上运行得很好。

8个回答

43

重置内容和设置没有起作用。

以下是我在深夜浪费了2个小时的原因:

我将一个UIControl outlet从界面构建器连接到了xib文件所有者的IBOutlet。由于某种原因,该IBOutlet已从所有者中删除,但是对outlet的引用仍悬空在xib中。这总是会给我出错:

"Terminating app due to uncaught exception 'NSUnknownKeyException'"

教训:在实现中删除任何变量的出口时,请确保取消连接IB中的相应连接

更新:(2015年1月26日)

接口生成器或nib表现出这种方式的原因是有充分的理由的,今天我意识到了为什么。

如果您在TheBaseClass中有一个IBOutlet,并且您在storyboard的TheSubClass中有一个nib或场景,则有两种(黑客)方法可用于连接此outlet:

  1. 在Identity Inspector下,将“Custom Class”标识符命名为TheBaseClass,连接输出口,然后在“Custom Class”部分中设置类名称为TheSubclass

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

当我遇到这个答案时,它就像落到了正确的位置,为什么Apple会让这个悬空引用问题保留下来。因为这不是一个bug。 这是一个特性。


我学到的教训是:不要使用IB。 - Jason Moore
2
同意,IB当时不够成熟,现在也不是。但它肯定比两年前好了无数倍。而且XCode5 IB的功能使得不使用IB变得更加困难,因为它太棒了。我已经从仅编程转向基于IB的开发,并且仍然坚信它 :) - Nitin Alabur
你是我的救星!我作为一名安卓开发者刚开始尝试iOS开发,这个问题困扰了我4个小时! - Sri Harsha Chilakapati

15

修复 - 进入iOS模拟器 > 重置内容和设置


10

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

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

祝好运。


2
这在我工作于 Ionic / Cordova 应用程序时帮了我大忙。清除 Main Interface 的值立即解决了问题。错误对问题的描述不是很具体。 - newz2000
我也在使用Ionic,由于某种原因我设置了主界面,浪费了几个小时的时间后,感谢@newz2000,我找到了问题所在。 - marman
我使用Cordova/Ionic2应用程序时也有同样的问题。尽管我之前自己设定过。 - Rocco

9
问题出在你的nib文件上。在LetsEatAppDelegate和导航栏之间有一个旧的连接。
我不确定你的应用程序是如何设置的,可能有一个LetsEatAppDelegate对象在你的nib文件中,或者可能有一个文件所有者,其类设置为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:

有趣的是,这基本上是一个全新的项目,一个基于窗口的应用程序。我肯定从未创建过导航栏,我进行了搜索,但在我的项目中找不到任何有关导航栏的提及。 - Jon
1
尝试在界面构建器中打开相关的xib,右键单击“文件所有者”,并检查是否存在悬空连接。这种情况有时也会发生在我身上... - RDM
@Warkst感谢您澄清这一点。@Jon旧连接=悬空连接。 - Jesse Black
所以我回家尝试了一下,使用完全相同的代码,都是在XCode 4.x上(需要检查工作版本,我在家里用的是4.2.1),但我没有出现错误。 - Jon
我现在在家和工作中都是4.2.1版本。今天早上我在家成功运行了项目,然后来到工作,结果依然出现同样的错误。文件完全一致,XCode版本也完全一致。 - Jon

4

哦,天啊。在删除 @properties 和/或 IBActions 后,我遇到了同样的问题,这让我疯狂!Warkst 的建议非常正确。前往出现问题的视图控制器,在橙色球上单击,并取消选择任何未使用的引用。你可能需要向下滚动以找到它们所有。这解决了我的问题。非常感谢。


0

0

对我来说,清除 "Main Interface" 也解决了这个问题。在清除 "Main Interface" 并构建之前,您可能需要执行 "Clean" 操作。


1
但是为什么这会导致问题呢?这毫无意义。 - CommaToast

0

我也遇到了这个问题,

1.在AppDelegate方法中

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

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

2.当viewController加载视图时崩溃

我猜可能是因为我删除了xib文件,然后视图控制器仍然使用nib文件进行初始化..所以我添加了-(void)load view方法。现在没问题了..ps:我重置了模拟器,但没有用。

希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接