View Controller两次调用awakeFromNib

时间:2010-11-11 09:21:19

标签: objective-c cocoa

我正面临着这个奇怪的问题而且我不确定我哪里出错了。

情况:

我有一个MainWindowController类,它将加载要显示的正确的nib。 我创建了一个对象并将其更改为IB中的MainWindowController类,并将其与“MainWindowView”笔尖一起使用。

基本上,笔尖“MainWindowView”具有自定义视图和侧面的几个按钮,以便用户可以选择要加载的视图,并且它将加载其他相应的笔尖。我在IB中启动时隐藏了mainmenu,所以它只加载MainWindowView和其他nib文件。

虽然在调试时,当我在MainWindowController的awakeFromNib上放置NSLog时,我在控制台中看到它被调用了两次。

在我的项目中,我有一个与MainMenu.xib一起使用的startupController类,代码如下。

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

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

1 个答案:

答案 0 :(得分:7)

听起来你正在创建两个MainWindowController对象,因此将为每个对象调用一次awakeFromNib。

startupContoller方法中的awakeFromNib正在创建一个MainWindowController对象并使用MainWindowView nib初始化它。如果您还向该nib添加了一个对象并将其类型设置为MainWindowController,则在加载该nib时将创建另一个MainWindowController对象。

您应该从MainWindowView nib中删除MainWindowController对象,而是将File的Owner对象的类型设置为MainWindowController。 (MainWindowController应该是NSWindowController的子类)您连接到您创建的对象的任何连接都应该连接到File的所有者。

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