Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 由于未捕获异常而终止应用程序';NSUnknownKeyException';:iOS应用程序崩溃_Iphone_Uiviewcontroller - Fatal编程技术网

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

Iphone 由于未捕获异常而终止应用程序';NSUnknownKeyException';:iOS应用程序崩溃,iphone,uiviewcontroller,Iphone,Uiviewcontroller,我是iPhone应用程序的初学者程序员。我想知道是否有人能帮我解决我应用程序中的一个bug。在XCode上编程时,我发现我的应用程序在添加了一点代码后在启动时突然崩溃。输出面板显示以下错误: *由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setValue:forUndefinedKey:]:此类不符合按键播放的键值编码。” *第一次抛出调用堆栈: (0x1c91012 0x10cee7e 0x1d19fb1 0xb7ae41 0xafc5f8 0xaf

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

*由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setValue:forUndefinedKey:]:此类不符合按键播放的键值编码。” *第一次抛出调用堆栈: (0x1c91012 0x10cee7e 0x1d19fb1 0xb7ae41 0xafc5f8 0xafc0e7 0xb26b58 0x230019 0x10e2663 0x1c8c45a 0x22eb1c 0xf37e7 0xf3dc8 0xf3ff8 0xf4232 0x433d5 0x4376f 0x4395 0x8eceab6 0x4c917 0x1096c 0x1194b 0x22cb5 0x23beb 0x15698 0x1becdf9 0x1becad0 0x1c06bf5 0x1C1C06962 0x37BB6 0x36F44 0x36E17A 0x21FFC 0x212D) 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]));
    }
}
很抱歉浪费了您的时间,但我已经出现此错误很长时间了,如果您有解决方案,我希望您能解决此问题。

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

发生的情况是,您的Storyboard/XIB希望您的类有一个名为
play
的属性。正如您的界面所示,您没有一个名为that的属性。不过我怀疑,您以前是这样做的,但后来将其重命名为
playbtn

这就是所谓的

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

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

[self setValue:button forKey:@"play"]
有关键/值编码和序列化的更多启示,请抓起一把舒适的椅子,阅读并阅读

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

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

您只需单击该小
x
即可断开与缺少的属性的连接

今后如何防止这种情况
无论何时更改代码中的属性,都需要确保中断Interface Builder中的任何关联连接。

问题出在xib或故事板文件中。您有一个链接到
play
的项目(可能是UIButton),但您在代码中将该项目重命名为
playbtn
,而没有在xib中重新分配插座。检查你的xib/故事板上的播放按钮,移除它不存在的插座。嘿,又是这个家伙告诉你CIA不玩了。
#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
[self setValue:button forKey:@"play"]