iPhone应用程序崩溃与NSUnknownKeyException setValue:forUndefinedKey:
我正在写我的第一个iPhone应用程序,所以我没有得到解决调试的方式。 本质上,我的应用程序显示图像,并在触摸时播放短暂的声音。 在XCode中编译和构建项目时,一切都会成功完成,但是当应用程序在iPhone模拟器中运行时,它会崩溃。iPhone应用程序崩溃与NSUnknownKeyException setValue:forUndefinedKey:
我得到以下错误:这里
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意味着什么或者为什么这个类不是密钥的密钥值。
(这不是真正的iPhone特定 - 同样的事情会发生在普通的可可)。
NSUnknownKeyException是使用Key-Value Coding访问该对象不具有的密钥时的常见错误。
大多数可可对象的属性可以直接访问:
[@"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”设置一个值,该键显然不支持该键。如果你使用的是界面生成器,它可能是你的笔尖的东西。
找到正在使用'kramerImage'的地方,并尝试从那里追踪它。
此外,当您重命名视图时,不要忘记删除文件所有者的引用。它也可能引发这个错误。
这里有一个你会得到这个错误 - 以及如何解决它。加载一个只有自定义TableViewCell的笔尖时,我得到它。我使用IB来构建一个只有文件所有者,第一响应者和TableViewCell的xib。 TableViewCell只有4个UILabel,它们与4个名为rootCell的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的Owner作为一个NSObject,但是让UITableCell成为你想要的类。
似乎你是合成的ImageView,后做
@interface MyFirstIphoneAppViewController : UIViewController<> {
UIImageView *InitialkramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage;
那么当你在Interface Builder中打开“MyFirstIphoneAppViewController.xib”,你正在从工具(菜单)的形象图/库书房连接的是来自“MyFirstIphoneAppViewController.xib”文件所有者的“InitialkramerImage”插座。然后你保存了这个项目。但在此之后,您可能会将插座变量“InitialkramerImage”的名称更改为“kramerImage”。那么,这样做
@interface MyFirstIphoneAppViewController : UIViewController<> {
UIImageView *kramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage;
和保存,当你运行该项目后,有没有“InitialkramerImage”中的“MyFirstIphoneAppViewController.xib”出口的所有脑干。所以,当你运行该项目不会有出路从引用的ImageView的“kramerImage”和
"For displaying the view, UIViewController will try to find the outlet to "InitialkramerImage" which is not existing."
所以,这将引发“NSUnknownKeyException”。
You can check the missing outlet by opening the nib(.xib) file then right clicking on the 'Files Owner' of that.
我今天有这个问题。我的导航控制器中没有为View Controller指定的类。如果您无法在Interface Builder中为您的视图指定正确的类,则会经常发生这种情况。
您也会遇到无效的选择器问题。总是检查你的Interface Builder类和连接!
如果您在其他地方完成了此代码并且有zip /压缩文件,请尝试再次提取它。它可能工作我不知道为什么,但我觉得这是一个提取问题。
或者您可以尝试将IBOutlet更改为kramerImage并在NIB中重新绑定它。
我有这种情况,事实证明,即使找到变量的所有实例并删除它们,我的应用程序仍然崩溃。继承人发生了什么......我从XIB的textfield中创建了另一个变量实例到我的viewController.h中,但是我意识到我不再需要它并将其删除。事实证明,我的程序看到了它,并一直试图在程序中使用它,如果这发生在其他任何地方,只要进入你的XIB,右键单击按钮或文本字段等,并删除任何额外的未使用的变量。
这是我如何解决我的,在界面生成器中右键单击视图控制器,应该有缺少的插座或操作方法上的感叹号。找到并删除所有的参考,并解决它。
发生这种情况是因为我删除了.m文件中的操作方法。
我得到这个错误,这是与interfacebuilder做的事情,但我不知道如何解决它。 – bentford 2008-09-24 23:58:36
非常感谢 - 另外浪费了3个小时终于修好了。 :) – 2010-08-03 16:40:35
我在将文件从一个项目复制到另一个项目的情况下遇到了这个问题。我的xib提到错误的类名。这个答案为我提供了足够的信息,因此谢谢。 – Grumdrig 2010-08-24 21:37:07