19

我正在编写我的第一个 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 是什么意思,或者为什么该类不符合键的键值编码。

4

8 回答 8

22

(这并不是真正的 iPhone 特有的——在普通的 Cocoa 中也会发生同样的事情)。

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,它可能在您的 nib 中。

找到使用“kramerImage”的位置,并尝试从那里追踪它。

于 2008-09-05T17:28:35.070 回答
10

此外,当您重命名视图时,不要忘记删除文件所有者上的引用。它也可能引发此错误。

于 2010-03-29T13:34:10.810 回答
8

这是您会收到此错误的地方 - 以及如何修复它。我在加载一个只有一个自定义 TableViewCell 的笔尖时得到它。我使用 IB 构建了一个只有文件所有者、第一响应者和 TableViewCell 的 xib。TableViewCell 仅有 4 个 UILabel,它们与一个具有 4 个称为 rootCell 的 IBOutlet UILabel 的类相匹配。我将 TableViewCell 的类更改为 rootCell。它工作得很好,直到 a 做了一些更改,突然我得到了 setValue:forUndefinedKey: 当我从笔尖加载类后实例化它时:

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

    cell = [nib objectAtIndex:0];

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

于 2010-10-10T06:06:33.027 回答
2

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

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

于 2011-07-06T17:04:58.883 回答
2

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

于 2012-07-08T01:58:33.210 回答
2

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

This happened because i deleted the action method in the .m file.

于 2012-07-18T14:30:33.353 回答
0

看来你在做

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

然后在合成该 imageview 之后,当您在 Interface Builder 中打开“MyFirstIphoneAppViewController.xib”时,您将从 Tool(menu)/Library den 中获取一个图像视图,将该插座链接到“MyFirstIphoneAppViewController.xib”的文件所有者的“InitialkramerImage” . 然后你保存了项目。但在那之后,您可能会将出口变量“InitialkramerImage”的名称更改为“kramerImage”。所以,在这样做之后

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

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

“为了显示视图,UIViewController 将尝试找到不存在的“InitialkramerImage”的出口。”

所以,它会抛出“NSUnknownKeyException”。

您可以通过打开 nib(.xib) 文件然后右键单击该文件的“文件所有者”来检查丢失的插座。

于 2010-11-10T11:26:06.660 回答
0

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

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

于 2012-05-09T04:23:12.710 回答