iPhone应用程序崩溃,并带有NSUnknownKeyException setValue:forUndefinedKey:

时间:2020-03-05 18:48:20  来源:igfitidea点击:

我正在写我的第一个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的事情,在普通可可中也会发生同样的事情)。

使用键值编码访问对象没有的键时,NSUnknownKeyException是一个常见错误。

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

[@"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构建了一个只有文件的所有者,第一响应者和TableViewCell的xib。 TableViewCell仅有4个UILabel,它们与具有4个IBroot的UILabel称为rootCell的类相匹配。我将TableViewCell的类更改为rootCell。它工作良好,直到进行了几处更改为止,然后突然我得到了setValue:forUndefinedKey:当我刚从笔尖加载该类后实例化该类时:

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

    cell = [nib objectAtIndex:0];

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

回答

看来你在做

@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;

并在运行时保存项目," MyFirstIphoneAppViewController.xib"中不存在" InitialkramerImage"的出口。因此,当我们运行项目时,将不会有从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.