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

Geo*_*523 10 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 :终止调用抛出异常(lldb)

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

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

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

我的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;
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

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

Way*_*man 43

问题是什么:

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

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

这是指的意思

这个类不是关键游戏的关键值编码兼容

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

[self setValue:button forKey:@"play"]
Run Code Online (Sandbox Code Playgroud)

有关键/值编码和序列化的其他启示,请抓住一把舒适的椅子并阅读键值编码编程指南存档与序列化编程指南

如何修复它:

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

在此输入图像描述

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

您需要做的就是点击那一点x来打破与缺失属性的连接.

如何在未来预防这种情况

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