我是iOS开发的老手,所以遵循HelloWorld教程here。在添加按钮,文本字段和标签后,我已经到了测试应用程序的阶段。据我所知,我已经按照教程的说法进行了操作,并且在运行应用程序时出现了这个错误:
2013-07-13 15:26:39.629 HelloWorld [1304:11303] *终止app到期 未捕获的异常'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: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
我尝试使用this回答,但我看不到XIB文件(我想因为我正在使用Storyboard?)而且我看不到VC中有任何明显的差异。
请帮忙。
答案 0 :(得分:0)
故事板是一个封装了一组XIB文件的单个文件。故事板中的每个“场景”代表一个单独的XIB文件。
在故事板中......
(1)在相关场景中选择View Controller
(2)打开Identity Inspector(右侧“实用程序”窗格中的第三个选项卡)。检查视图控制器的类是否正确设置为HelloWorldViewController
(3)检查View Controller的IBOutlets是否正确连接到正确的视图。 (按住Ctrl键并单击每个视图并在HUD中检查它的设置。)
'Wiring up'需要将CTRL从viewController拖到故事板场景中的相关视图。将出现一个列表,其中包含要选择的相应IBOutlet属性。
这些属性可以放在.h文件的接口声明中,也可以放在.m文件的类扩展中。
声明为@interface
的接口(在.h文件中)是公共的;声明为@interface()
(通常在.m文件中)的类扩展是该类的私有(尽管在Obj-C中没有任何内容是完全私有的)。类扩展对于声明私有属性或公开只读和私有读写的属性非常有用。请参阅apple docs。它们曾经很适合声明私有方法,但现在这是多余的:方法只需要声明我们是否要公开它们。
一个好的经验法则是尽可能将声明保留在类扩展名中,并保留在.h文件中。这些天应该只适用于属性,因为除非将它们公开,否则不需要方法声明。
您提到您通过将属性声明从类扩展移动到公共接口来解决问题。这很令人费解,因为这两个地方通常都可以接受这种用途。
答案 1 :(得分:0)
我删除了您在连接指示器上看到的所有引用插座和操作,同时在故事板工作区中逐个选择对象,并删除了由xcode自动添加的一些代码。
然后我再次按照教程制作它们。最后它运作良好。