【问题标题】:iPhone app crashing with NSUnknownKeyException setValue:forUndefinedKey: [duplicate]iPhone 应用程序因 NSUnknownKeyException setValue:forUndefinedKey: [重复] 而崩溃
【发布时间】:2010-09-07 22:55:30
【问题描述】:

我正在编写我的第一个 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 xib key-value-coding


    【解决方案1】:

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

    NSUnknownKeyException 是使用Key-Value Coding 访问对象没有的键时的常见错误。

    大部分 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”的使用位置,并尝试从那里追踪。

    【讨论】:

    • 我收到此错误,它与 interfacebuilder 有关,但我不知道如何修复它。
    • 谢谢你 - 又浪费了 3 个小时终于修好了。 :)
    • 我在将文件从一个项目复制到另一个项目的情况下遇到了这个问题。我的 xib 引用了错误的类名。这个答案为我提供了足够的信息,让我有一个灵光乍现的时刻,所以谢谢。
    • 感谢您的精彩解释。虽然我仍然很困惑,但这对我没有多大帮助。我只是为 TableCellView 加载一个包,但一切都在任何事情发生之前就崩溃了:pastebin.com/QuR29q6B
    【解决方案2】:

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

    【讨论】:

    • +1 这发生在我身上。我重命名了我的 MKMapView 的变量,突然 BAM! NSUknownUknownKeyException。
    • Storyboard 有一个没有链接的按钮,导致 KeyValue 错误。这解决了我的问题。谢谢!
    【解决方案3】:

    这是您会收到此错误的地方 - 以及如何解决它。我在加载一个只有一个自定义 TableViewCell 的笔尖时得到了它。我使用 IB 构建了一个只有文件所有者、第一响应者和 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's Owner 设为 NSObject,但将 UITableCell 设为您想要的类。

    【讨论】:

    • +1 请注意我自己和其他总是忘记这一点的人:使用 loadNibNamed:owner:options: 时,文件的所有者应该是 NSObject,主视图应该是您的班级类型,并且所有出口都应该连接到视图,而不是文件的所有者。
    • 谢谢欧文,我在同样的情况下苦苦挣扎。如所述解决。非常感谢!
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 谢谢。我在 IB 中正确指定了类,但是我的控制器和我在 initWithNibName 中指定的 nib 不匹配:- 我应该撤销我的复制+粘贴权限。
      • 回到 iOS 道场,练习复制+粘贴。
      【解决方案6】:

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

      这是因为我删除了 .m 文件中的操作方法。

      【讨论】:

        【解决方案7】:

        看来你在做

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

        然后在合成该 imageview 之后,当您在 Interface Builder 中打开“MyFirstIphoneAppViewController.xib”时,您将从 Tool(menu)/Library den 中获取一个 Image View,将该插座链接到“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) 文件然后向右 点击它的“文件所有者”。

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-07-03
            • 2012-06-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-22
            相关资源
            最近更新 更多