2013-07-13 25 views
0

我是iOS开发的小菜鸟,所以我遵循HelloWorld教程here。我已经到了我在添加按钮,文本字段和标签后测试应用程序的阶段。据我所知,我已经跟着教程去了信,我在运行应用时遇到了这个错误:Apple的HelloWorld教程中的NSUnknownKeyException

2013-07-13 15:26:39.629 HelloWorld [1304:11303] *终止应用程序由于 未捕获的异常“NSUnknownKeyException”,原因: “[< HelloWorldViewController 0x7566000>的setValue:forUndefinedKey:]: 这类不是密钥值编码兼容的键标签”。 *第一掷调用堆栈:(0x1c90012 0x10cde7e 0x1d18fb1 0xb79e41 0xafb5f8 0xafb0e7 0xb25b58 0x22f019 0x10e1663 0x1c8b45a 0x22db1c 0xf27e7 0xf2dc8 0xf2ff8 0xf3232 0x423d5 0x4276f 0x42905 0x4b917 0xf96c 0x1094b 0x21cb5 0x22beb 0x14698 0x1bebdf9 0x1c13f3f 0x1c1396f 0x1c36734 0x1c35f44 0x1c35e1b 0x1017a 0x11ffc 0x1f9d 0x1ec5) 的libc + + abi.dylib:终止称为抛出异常

HelloWorldViewController.m生成的代码是:

#import "HelloWorldViewController.h" 

@interface HelloWorldViewController() 
@property (weak, nonatomic) IBOutlet UILabel *label; 
@property (weak, nonatomic) IBOutlet UITextField *textField; 
- (IBAction)changeGreeting:(id)sender; 

@end 

@implementation HelloWorldViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)changeGreeting:(id)sender { 
} 
@end 

而在HelloWorldViewController.h

#import <UIKit/UIKit.h> 

@interface HelloWorldViewController : UIViewController 

@end 

我尝试使用this的答案,但我看不到一个XIB文件(我想是因为我使用的是故事板?),我不能看到任何VC差异明显。

请帮忙。

+0

[此类不是密钥的关键值编码兼容](http://stackoverflow.com/questions/3088059/this-class-is-not-key-value-coding-compliant-for -key) – jtbandes

回答

0

故事板是一个封装了XIB文件集合的单个文件。故事板中的每个“场景”代表本来是单个XIB文件的内容。

在故事板...

(1)中的相关场景选择视图控制器。 (2)打开Identity Inspector(右侧“实用工具”窗格中的第三个选项卡)。检查视图控制器的类是否正确设置为HelloWorldViewController。 (3)检查视图控制器的IBOutlets是否连接正确的视图。 (按住Ctrl键点击每个视图并检查它在HUD中的设置)。

'接线'需要将CTRL-从viewController拖动到故事板场景中的相关视图。一个列表将出现适当的IBOutlet属性来选择。

这些属性可以放在.h文件的接口声明中,也可以放在.m文件的类扩展名中。

声明为@interface(在.h文件中)的接口是公共的;声明为@interface()(通常在.m文件中)的类扩展对类是私有的(尽管Obj-C中没有任何内容是完全私有的)。类扩展对于声明私有属性或公开只读和私有的readwrite属性非常有用。请参阅apple docs。他们曾经很擅长声明私有方法,但现在这是多余的:方法只需要声明,如果我们想让它们公开。

一个很好的经验法则是尽可能将您的声明保存在类扩展名和.h文件中。现在这只适用于属性,因为除非将它们公开,否则不需要方法声明。

您提到您通过将您的属性声明从类扩展移动到公共接口来解决您的问题。这令人费解,因为这两个地点通常都可以接受。

+0

(2)没问题。 (3)不太清楚我在这里寻找什么 - 它看起来不像任何东西的连接? –

+0

好吧,我想我已经修复了它,但我并不真正了解如何。在'.h'和'.m'文件中有一个@界面。我将'@ property'属性移动到头部,现在我没有看到错误?为什么有两种语法不同的界面?我也是Objective-C的新手,所以我可能因此而感到困惑! –

+0

@EdKing,查看我的更新说明... – foundry

0

我删除了所有参考插口和动作,您可以在连接指示器中看到,同时在故事板工作区中逐个选择对象,并删除由xcode自动添加的一些代码。

然后我再次通过以下教程制作它们。最后它运行良好。