我最近将我的IDE更新为XCode 4.0,并看到了Utillity-Application样板代码中的一个奇怪的变化:
首先,MainViewController.h-File:
#import <UIKit/UIKit.h>
@class MainViewController;
@interface UtilityAppDelegate : NSObject <UIApplicationDelegate> {
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet MainViewController *mainViewController;
@end
问题1:首先声明“mainViewController”在哪里?我没有在任何地方找到它。
在* .m-File中有一个
@synthesize mainViewController=_mainViewController;
语句。所以我的第二个问题:“_mainViewController”隐藏在哪里?无法在任何地方找到声明。它以某种方式出现在我猜的主要* .nib文件中。
但还有另一个问题:我确实在我最近的一个项目中添加了一个UINavigationController,不再需要mainViewController了。但是当我从MainViewController.m / .h中删除@property和@synthesize时,由于这个异常,我再也无法运行该应用程序了:
setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key mainViewController.'
发生在这一行
int retVal = UIApplicationMain(argc, argv, nil, nil);
在main.m。
感谢您的帮助。
答案 0 :(得分:1)
看看你info.plist它应该在那里宣布。如果您使用模板创建了应用程序,则由plist配置。这有一些隐式声明,mainWindow.xib(在我的例子中)包含多个窗口。有appDelegate和viewController的连接,请参见第二个截图。
屏幕截图的最后一行:
答案 1 :(得分:0)
您第一次遇到新的ABI。不再需要为属性声明变量。如果您使用@property
和@synthesize
,系统会自动为您生成支持ivar。
您可能收到KVC错误,因为NIB仍然引用旧属性。你应该在编译期间看到关于这个的警告。在IB中,查看您的App Delegate;它可能仍然有一个mainViewController的插座,你可能仍在生成一个MainViewController。您需要从NIB中删除它们。
答案 2 :(得分:0)
当您使用这样的声明时,您不需要显式定义属性。
·H
@property (nonatomic, retain) IBOutlet MainViewController *mainViewController;
的.m
@synthesize mainViewController=_mainViewController;
_mainViewController未隐藏。它指向mainViewController,它在.h
中的@property语句中隐式定义@synthesize mainViewController=_mainViewController;
此格式用于区分ivar和其他属性。它指的是mainViewController。
您删除了mainViewController的声明@ property / @ synthesize,但它仍然存在于nib文件(IB)中。从IB中删除它,你应该很高兴。