我正在编写我的第一个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是什么意思,或者为什么该类不是密钥值编码兼容的密钥。
答案 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中再次绑定它。