NSUnknownKeyException in Apple 的 HelloWorld 教程



我是iOS开发的新手,所以我在这里学习HelloWorld教程。我已经到了添加按钮、文本字段和标签后测试应用程序的阶段。据我所知,我已经完全遵循了教程,当我运行应用程序时,我遇到了这个错误:

2013-07-13 15:26:39.629 HelloWorld〔1304:11303〕*终止应用程序到期到未捕获的异常"NSUnknownKeyException",原因:'[<HelloWorldViewController 0x756000>设置值:forUndefinedKey:]:此类与键标签的键值编码不兼容。'*第一次抛出调用堆栈:(0x1c90012 0x10cd7e 0x1d18fb1 0xb79e41 0xafb5f8 0xafb0e7 0xb25b58 0x22f019 0x10e1663 0x1c8b45a 0x22db1c0xf27e7 0xf2dc8 0xf2ff8 0xf3232 0x423d5 0x4276f 0x42905 0x4b917 0xf96c0x1094b 0x21cb5 0x22beb 0x14698 0x1bebdf9 0x1c13f3f 0x1c1396f0x1c36734 0x1c35f44 0x1c35e1b 0x1017a 0x11fc 0x1f9d 0x1ec5)libc++abi.dylib:调用terminate抛出异常

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

我试着使用这个答案,但我看不到XIB文件(我想是因为我使用的是Storyboard吗?),我也看不到VC中有任何明显的差异。

请帮忙。

故事板是封装XIB文件集合的单个文件。故事板中的每个"场景"都表示一个XIB文件。

在故事板中。。。

(1) 在相关场景中选择"视图控制器"
(2) 打开"标识检查器"(右侧"实用程序"窗格中的第三个选项卡)。检查视图控制器的类是否正确设置为HelloWorldViewController
(3) 检查视图控制器的IBOutlets是否正确连接到正确的视图。(按住Ctrl键并单击每个视图,然后在HUD中检查其设置)。

"连接"需要按CTRL键从视图控制器拖动到故事板场景中的相关视图。将显示相应IBOutlet属性的列表以供选择。

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

声明为@interface的接口(在.h文件中)是公共的;声明为@interface()的类扩展名(通常在.m文件中)对该类是私有的(尽管在Obj-C中没有什么是完全私有的)。类扩展对于声明私有属性或公共只读和私有读写的属性非常有用。请参阅apple文档。它们过去很适合声明私有方法,但现在这是多余的:方法只需要在我们想公开它们时声明。

一个好的经验法则是,尽可能地将声明保留在类扩展名中,而不在.h文件中。如今,这应该只适用于属性,因为除非公开方法声明,否则不需要方法声明。

您提到通过将属性声明从类扩展移到公共接口来解决问题。这令人费解,因为这两个位置通常都可以用于此用途。

我删除了连接指示器上可以看到的所有引用出口和操作,同时在情节提要工作区逐个选择对象,并删除了xcode自动添加的一些代码。

然后我又按照教程做了它们。最后它工作得很好。

最新更新