2010-11-11 68 views
4

我正面临着这个奇怪的问题,我不确定哪里出错了。视图控制器调用awakeFromNib两次

现状:

我有一个MainWindowController类将加载到显示正确的碎粒。 我创建了一个对象,并将其更改为IB中的MainWindowController类,并将它放在“MainWindowView”nib中。

所以基本上笔尖“MainWindowView”具有自定义视图和上侧的几个按钮,使得用户可以选择哪个视图加载和它会加载其它各个笔尖。我在IB中启动时隐藏了mainmenu,因此它只会将MainWindowView加载到其他nib文件中。

但是在调试,当我把一个NSLog的上MainWindowController的awakeFromNib,我看到在控制台它被称为两次。

在我的项目

,我有一个startupController类连同MainMenu.xib用下面的代码。

startUpController.h:

#import <Cocoa/Cocoa.h> 
#import "MainWindowController.h" 

@interface startupController : NSObject { 
MainWindowController *myWindowController; 
} 
@end 

startUpController.m:

#import "startupController.h" 
@implementation startupController 
-(void)awakeFromNib { 
[super init]; 
if(myWindowController == nil) 
myWindowController = [[MainWindowController alloc] initWithWindowNibName:@"MainWindowView"]; 
[myWindowController showWindow:self]; 
} 
@end 

任何帮助表示赞赏。谢谢。

回答

7

这听起来像你正在创建两个MainWindowController对象,所以awakeFromNib将为每个调用一次。

你awakeFromNib在startupContoller方法是创建一个MainWindowController对象,并与MainWindowView笔尖对其进行初始化。如果您还向该笔尖添加了一个对象并将其类型设置为MainWindowController,则将在加载该笔尖时创建另一个MainWindowController对象。

您应该删除从MainWindowView笔尖MainWindowController对象,而是设置文件的所有者对象的类型MainWindowController。 (MainWindowController应该是NSWindowController的子类)任何连接到你创建的对象的连接都应该连接到文件的所有者。

另外,你不应该在awakeFromNib中调用[super init]。你只应该在init方法中调用[super init]。

+0

非常感谢泰勒,帮助删除了MainWindowController对象。我不知道我可以使用文件所有者进行连接,因此我创建了该对象。谢谢! – han 2010-11-12 00:47:23

相关问题