iPhone应用程序崩溃与NSUnknownKeyException setValue:forUndefinedKey:

时间:2008-09-05 16:23:57

标签: iphone xib key-value-coding

我正在编写我的第一个iPhone应用程序,所以我还没有找到很多调试方法。 基本上我的应用程序显示图像,触摸时播放短暂的声音。 在XCode中编译和构建项目时,一切都成功构建,但是当应用程序在iPhone模拟器中运行时,它会崩溃。

我收到以下错误:

Application Specific Information:
iPhone Simulator 1.0 (70), iPhone OS 2.0 (5A331)
*** Terminating app due to uncaught exception 'NSUnknownKeyException', 
reason: '[<UIView 0x34efd0> setValue:forUndefinedKey:]: this class is not key value 
coding-compliant for the key kramerImage.'

kramerImage这里是我用于背景的图像。

我不确定NSUnknownKeyException是什么意思,或者为什么该类不是密钥值编码兼容的密钥。

8 个答案:

答案 0 :(得分:22)

(这不是特定于iPhone的 - 在常规Cocoa中会发生同样的事情。)

使用Key-Value Coding访问对象没有的密钥时,NSUnknownKeyException是一个常见错误。

大多数Cocoa对象的属性可以直接访问:

[@"hello world" length]    // Objective-C 1.0
@"hello world".length      // Objective-C 2.0

或通过键值编码:

[@"hello world" valueForKey:@"length"]

如果我使用以下行,我会得到一个NSUnknownKeyException:

[@"hello world" valueForKey:@"purpleMonkeyDishwasher"]

因为NSString没有名为'purpleMonkeyDishwasher'的属性(键)。

代码中的某些东西试图在UIView上设置键'kramerImage'的值,显然它不支持该键。如果你正在使用Interface Builder,它可能是你的笔尖。

找到正在使用'kramerImage'的地方,并尝试从那里追踪它。

答案 1 :(得分:10)

同样,当您重命名视图时,请不要忘记删除文件所有者的参考。它也可能引发此错误。

答案 2 :(得分:8)

以下是您将收到此错误的方法 - 以及如何解决此问题。我在加载一个只有自定义TableViewCell的笔尖时得到它。我使用IB来构建一个只拥有File的Owner,First Responder和TableViewCell的xib。 TableViewCell只有4个UILabel,它与一个名为rootCell的4个IBOutlet UILabel相匹配。我将TableViewCell的类更改为rootCell。它工作正常,直到做了几次更改,突然我得到了setValue:forUndefinedKey:当我从一个笔尖加载它后实例化该类时:

    NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"rootCell-iPad" owner:self options:nil];

    cell = [nib objectAtIndex:0];

当笔尖试图加载时,它在第一行失败了。过了一会儿,我注意到它试图将IBOutlet标签与根控制器匹配,而不是rootCell类!那是我的小费。我做错了是无意中将文件所有者更改为rootCell类。当我将其更改回NSObject时,它在加载时没有尝试匹配委托(rootController)。因此,如果您正在执行上述操作,请将File的所有者设为NSObject,但将UITableCell设为您想要的类。

答案 3 :(得分:2)

今天我遇到了同样的问题。我的导航控制器中没有为View Controller指定正确的类。如果您未能在Interface Builder中为视图指定正确的类,则会经常发生这种情况。

您也会收到无效的选择器问题。始终检查Interface Builder类和连接!

答案 4 :(得分:2)

我有这种情况,甚至在找到变量的所有实例并删除它们之后我的应用程序仍然崩溃。继承人发生了什么...我从我的XIB文本域创建了另一个变量实例到我的viewController.h但我意识到我不再需要它并删除了它。事实证明我的程序看到并继续尝试在程序中使用它,所以将来如果这种情况发生在其他地方只是进入你XIB右键单击按钮或文本字段等并删除任何额外的未使用的变量。

答案 5 :(得分:2)

这就是我解决了我的问题,在界面构建器中右键单击View Controller,缺少的插座或操作方法上应该有一个感叹号。查找并删除所有引用并解决它。

这是因为我删除了.m文件中的操作方法。

答案 6 :(得分:0)

好像你在做什么

@interface MyFirstIphoneAppViewController : UIViewController<> {
    UIImageView *InitialkramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage;

然后在合成该imageview之后,当您在Interface Builder中打开“MyFirstIphoneAppViewController.xib”时,您正在从“工具”(菜单)/“库”中将图像视图连接到“MyFirstIphoneAppViewController的文件所有者”中的“InitialkramerImage”的.xib”。然后你保存了项目。但之后您可能会将出口变量“InitialkramerImage”的名称更改为“kramerImage”。所以,这样做之后

@interface MyFirstIphoneAppViewController : UIViewController<> {
    UIImageView *kramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage;

并在运行时保存项目,“MyFirstIphoneAppViewController.xib”中不存在“InitialkramerImage”的出口。因此,当您运行项目时,将没有插件从Imageview引用到'kramerImage'和

  

“用于显示视图,   UIViewController将尝试查找   出口到“InitialkramerImage”哪个   不存在。“

所以,它会抛出“NSUnknownKeyException”。

  

您可以查看缺少的插座   然后打开nib(.xib)文件   点击该文件的“文件所有者”。

答案 7 :(得分:0)

如果你在其他地方完成了这个代码,并且有一个zip /压缩文件,请尝试再次提取它。它可能有用我不知道为什么,但我觉得这是一个提取问题。

或者您可以尝试将IBOutlet更改为kramerImage并在NIB中再次绑定它。