10

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

* 由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setValue:forUndefinedKey:]:此类不符合键值编码的键播放。” * First throw call stack: (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 :终止称为抛出异常(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

很抱歉浪费您的时间,但我已经遇到这个错误很长时间了,如果您有解决方案,我会很高兴。

4

1 回答 1

45

问题是什么:

在运行时,您的视图控制器将从其 XIB/Storyboard 中反序列化。在此过程中,它将读取 IB 文件中的所有对象并开始使用NSCoder. 当它在您的视图中实例化这些对象时,它将读取情节提要中的IBOutlet和连接,并开始将水合对象分配给在设计IBAction时连接的那些属性,以便您在运行时以编程方式访问它们。但问题在于:如果您有一个指向不存在的属性的连接,那么将抛出此异常,因为它被告知存在一个实际上不存在的属性。

发生的事情是您的 Storyboard/XIB 期望您的班级有一个名为play. 正如您的界面所示,您没有一个名为 that 的属性。不过,我怀疑您曾经使用过,但将其重命名为playbtn.

这是什么意思

此类不符合关键播放的关键值编码

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

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

有关 Key/Value Coding 和序列化的更多启发,请坐在舒适的椅子上阅读Key Value Coding Programming GuideArchives and Serializations Programming Guide

如何修复它:

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

在此处输入图像描述

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

您需要做的就是单击那个小x按钮以断开与丢失属性的连接。

如何在未来防止这种情况

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

于 2013-07-09T02:33:50.170 回答