iPhone 应用程序因 NSUnknownKeyException setValue:forUndefinedKey: 崩溃[复制]
-
09-06-2019 - |
题
这个问题在这里已经有答案了:
我正在编写我的第一个 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 是什么意思,也不知道为什么该类与键的键值编码不兼容。
解决方案
(这并不是 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,它可能位于您的笔尖中。
找到使用“kramerImage”的位置,并尝试从那里追踪它。
其他提示
另外,当您重命名视图时,不要忘记删除对文件所有者的引用。它也可能会引发此错误。
这是您会遇到此错误的地方 - 以及如何修复它。我在加载一个只有自定义 TableViewCell 的笔尖时得到了它。我使用 IB 构建了一个 xib,其中只有文件所有者、第一响应者和 TableViewCell。TableViewCell 只有 4 个 UILabels,与一个名为 rootCell 的具有 4 个 IBOutlet UILabels 的类相匹配。我将 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's Owner 设为 NSObject,但将 UITableCell 设为您所需的类。
我遇到了这种情况,结果即使在找到变量的所有实例并删除它们之后,我的应用程序仍然崩溃。这是发生了什么事...我从 XIB 的文本字段到 viewController.h 创建了变量的另一个实例,但我意识到我不再需要它并删除了它。事实证明,我的程序看到了这一点,并一直尝试在程序中使用它,因此将来如果这种情况发生在其他任何地方,只需进入 XIB,右键单击按钮或文本字段等,然后删除任何额外的未使用的变量。
我今天也遇到了同样的问题。我没有在导航控制器中为视图控制器指定正确的类。如果您未能在 Interface Builder 中为视图指定正确的类,这种情况就会经常发生。
您还会遇到无效选择器问题。始终检查您的 Interface Builder 类和连接!
这就是我解决我的问题的方法,在界面生成器中右键单击视图控制器,缺少的插座或操作方法上应该有一个感叹号。找到并删除所有引用并解决它。
发生这种情况是因为我删除了 .m 文件中的操作方法。
看来你正在做
@interface MyFirstIphoneAppViewController : UIViewController<> {
UIImageView *InitialkramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage;
然后,在合成该图像视图后,当您在 Interface Builder 中打开“MyFirstIphoneAppViewController.xib”时,您将从工具(菜单)/库 den 中获取图像视图,将该出口链接到“MyFirstIphoneAppViewController.xib”的文件所有者的“InitialkramerImage” 。然后您保存了该项目。但之后您可以将出口变量“InitialkramerImage”的名称更改为“kramerImage”。所以,在这样做之后
@interface MyFirstIphoneAppViewController : UIViewController<> {
UIImageView *kramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage;
并在运行时保存项目,“MyFirstIphoneAppViewController.xib”中不存在“InitialkramerImage”的出口。因此,当您运行该项目时,将不会有从 Imageview 到“kramerImage”的出口引用,并且
“为了显示视图,UiviewController将尝试找到“初始Kramerimage”的插座,而该插座不存在。
因此,它将抛出“NSUnknownKeyException”。
您可以通过打开Nib(.xib)文件,然后右键单击其中的“文件所有者”来检查失踪的插座。
如果您在其他地方完成了此代码并且有一个 zip/压缩文件,请尝试再次提取它。它可能有效,我不知道为什么,但我觉得这是一个提取问题。
或者您可以尝试将IBOutlet更改为kramerImage并在NIB中再次绑定它。