2011-04-08 160 views
0

我最近更新了我的IDE的XCode 4.0,看到在Utillity-应用样板代码一个奇怪的变化:_mainViewController在哪里声明和初始化?

首先,MainViewController.h-文件:

#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-文件有一个

@synthesize mainViewController=_mainViewController; 

声明。所以我的第二个问题:“_mainViewController”隐藏在哪里?无法在任何地方找到声明。它来自我猜想的主要* .nib文件。

但还有另一个问题:我没有添加一个UINavigationController到我最近的项目之一,并且不再需要mainViewController。但是,当我删除@property和@synthesize了MainViewController.m/.H的,我不能运行的应用程序了,因为这样的异常:

setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key mainViewController.' 

发生在该行

int retVal = UIApplicationMain(argc, argv, nil, nil); 

在main.m.

Thx寻求帮助。

回答

0

问题1:

当您使用像这样的声明时,您不需要显式定义属性。

.H

@property (nonatomic, retain) IBOutlet MainViewController *mainViewController; 

。米

@synthesize mainViewController=_mainViewController; 

问题2:

_mainViewController未隐藏。它指向其在@property声明隐含定义中.H

@synthesize mainViewController=_mainViewController; 

这种格式使用的ivar和其他属性来区分mainViewController。它指的是mainViewController。

问题3:

您删除的声明@财产/ @合成用于mainViewController,但它仍然在笔尖文件(IB)的存在。从IB删除它,你应该很好走。

+0

thx。我有不同语言的两个版本的我的xib文件。其中一个未正确更新。 – Kie 2011-04-08 13:04:51

+0

不支持显式变量的属性在所有平台上都不受支持,顺便说一句。他们似乎在ARM(iOS)和x64上,但不在x86上。 – DarkDust 2011-04-08 13:32:26

+0

谢谢你指出。约旦 – Jordan 2011-04-08 13:51:15

1

看着你info.plist它应该在那里声明。如果您使用模板创建了应用程序,则由plist配置它。有一些隐式声明由此完成,mainWindow.xib(在我的例子中)包含多个窗口。有appDelegate和viewController的连接,请参阅第二个截图。

截图的最后一行:

enter image description here

enter image description here

+0

这是MainWindow,而不是MainVieWController。 Info.plist正在定义自动加载的NIB。 – 2011-04-08 12:45:21

+0

是的,但在nib文件中存在与应用程序委托和viewController进行的连接。 – 2011-04-08 12:50:18

0

您遇到的新ABI首次。不再需要为属性实际声明变量。如果您使用@property@synthesize,则会自动为您生成后援伊娃。

您可能会收到KVC错误,因为NIB仍然引用旧的属性。在编译期间你应该看到这个警告。在IB中,查看您的App Delegate;它可能仍然有一个mainViewController的出口,并且你可能还在生成一个MainViewController。你需要从NIB中删除它们。