由于未捕获的异常'NSUnknownKeyException'终止应用程序:iOS应用程序崩溃

时间:2013-07-09 01:52:09

标签: iphone uiviewcontroller

我是一名从事iPhone应用的初学程序员。我想知道是否有人可以帮我解决我的应用中的错误。在XCode上编程时,我发现我的应用程序在添加更多代码后突然在启动时崩溃。输出面板显示以下错误:

  

*由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[setValue:forUndefinedKey:]:此类不是键值编码兼容键播放。“       * 第一次抛出调用堆栈:       (0x1c91012 0x10cee7e 0x1d19fb1 0xb7ae41 0xafc5f8 0xafc0e7 0xb26b58 0x230019 0x10e2663 0x1c8c45a 0x22eb1c 0xf37e7 0xf3dc8 0xf3ff8 0xf4232 0x433d5 0x4376f 0x43905 0x8eceab6 0x4c917 0x1096c 0x1194b 0x22cb5 0x23beb 0x15698 0x1becdf9 0x1becad0 0x1c06bf5 0x1c06962 0x1c37bb6 0x1c36f44 0x1c36e1b 0x1117a 0x12ffc 0x222d 0x2155)       libc ++ abi.dylib:terminate调用抛出异常       (lldb)

应用程序终止时显示的代码如下

#import <UIKit/UIKit.h>
#import "CIAAppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([CIAAppDelegate class]));
    }
}

我的ViewController.h显示:

#import <UIKit/UIKit.h>

@interface CIAViewController : UIViewController {
    IBOutlet UILabel *cruzia;
    IBOutlet UILabel *textarea;
    IBOutlet UIButton *playbtn;
    IBOutlet UIButton *tutorialbtn;
    IBOutlet UIButton *optionsbtn;
    IBOutlet UIButton *trainingbtn;
    IBOutlet UIButton *back;
}

-(IBAction)press;
-(IBAction)press2;
-(IBAction)press3;
-(IBAction)press4;
-(IBAction)press5;

我的ViewController.m也显示

#import "CIAViewController.h"

@interface CIAViewController ()
@end

@implementation CIAViewController

-(IBAction)press {
    cruzia.hidden = 0;
    textarea.hidden = 0;
    playbtn.hidden = 1;
    tutorialbtn.hidden = 1;
    optionsbtn.hidden = 1;
    trainingbtn.hidden = 1;
    back.hidden = 0;
    cruzia.text = @"Play";
    textarea.text = @"Hello! You are playing the game of Cruzia!";
}

-(IBAction)press2 {
    cruzia.hidden = 0;
    textarea.hidden = 0;
    playbtn.hidden = 1;
    tutorialbtn.hidden = 1;
    optionsbtn.hidden = 1;
    trainingbtn.hidden = 1;
    back.hidden = 0;
    cruzia.text = @"Tutorial";
    textarea.text = @"Welcome! You are watching the Cruzia tutorial!";
}

-(IBAction)press3 {
    cruzia.hidden = 0;
    textarea.hidden = 0;
    playbtn.hidden = 1;
    tutorialbtn.hidden = 1;
    optionsbtn.hidden = 1;
    trainingbtn.hidden = 1;
    back.hidden = 0;
    cruzia.text = @"Options";
    textarea.text = @"You are now in the Options screen. You can edit the settings of the game!";
}

-(IBAction)press4 {
    cruzia.hidden = 0;
    textarea.hidden = 0;
    playbtn.hidden = 1;
    tutorialbtn.hidden = 1;
    optionsbtn.hidden = 1;
    trainingbtn.hidden = 1;
    back.hidden = 0;
    cruzia.text = @"Training";
    textarea.text = @"This is the training area. You can improve your Cruzia skills here!";
}

-(IBAction)press5 {
    cruzia.hidden = 0;
    textarea.hidden = 0;
    playbtn.hidden = 0;
    tutorialbtn.hidden = 0;
    optionsbtn.hidden = 0;
    trainingbtn.hidden = 0;
    back.hidden = 1;
    cruzia.text = @"Cruzia";
}


- (void)viewDidLoad
{
    textarea.hidden = 1;
    playbtn.hidden = 0;
    tutorialbtn.hidden = 0;
    optionsbtn.hidden = 0;
    trainingbtn.hidden = 0;
    back.hidden = 1;
    cruzia.text = @"Cruzia";
    [super viewDidLoad];
}

@end

我很抱歉浪费你的时间,但是我已经有很长一段时间没有这个错误了,如果你有解决方案,我会很喜欢。

1 个答案:

答案 0 :(得分:40)

问题是什么:

在运行时,您的视图控制器将从其XIB / Storyboard中反序列化。在此过程中,它将读取IB文件中的所有对象,并开始使用NSCoder实例化它们。当它在您的视图中实例化这些对象时,它将读取故事板中的IBOutletIBAction连接,并开始将水合对象分配给在 design 时间,以便您在运行时以编程方式访问它们。但这里是踢球者:如果你有一个指向不存在的属性的连接,那么将抛出这个异常,因为它被告知属性确实存在。

发生的事情是您的Storyboard / XIB希望您的班级拥有一个名为play的属性。如您的界面所示,您没有名为该属性的属性。我怀疑,你曾经,但重命名为playbtn

这就是

的含义
  

此类不是键值编码兼容键播放

这意味着它试图在幕后做这样的事情:

[self setValue:button forKey:@"play"]

有关键/值编码和序列化的其他启示,请抓住一把舒适的椅子并阅读Key Value Coding Programming GuideArchives and Serializations Programming Guide

如何修复它:

在Interface Builder中,右键单击视图控制器并查看连接列表:

enter image description here

查看属性play是如何连接的,并且旁边有一个黄色三角形?这是Interface Builder试图警告您在那里设置了连接,但标题没有显示该名称有IBOutlet

您需要做的就是点击那个小x来断开与缺失属性的连接。

如何防止未来

无论何时更改代码中的属性,您都需要确保在Interface Builder中断开任何关联的连接。