NSWindowController awakeFromNib被调用两次

时间:2012-02-15 03:26:25

标签: objective-c macos cocoa nswindowcontroller

我有一个应用程序打算在单击按钮时创建一个弹出窗口。弹出窗口将从nib文件加载。因此,单击按钮,窗口会愉快地弹出。但是,它的awakeFromNib方法被调用两次。这是代码;

申请代表:

...

-(IBAction)myButton:(id)sender{

    printf("[settings]: button pressed\n");

    Config_SelectorSetup *selectorSetup = [[Config_SelectorSetup alloc] initWithWindowNibName:@"Config_SelectorSetup"];

    printf("about to load\n");

    [[selectorSetup window] makeKeyAndOrderFront:sender];

}

Config_SelectorSetup.m

- (id) initWithWindowNibName:(NSString *)windowNibName{

    printf("[initWithWindowNibName]\n");

    if( self = [super initWithWindowNibName:windowNibName] ){

        ...

    }

    return self;

}

- (void)awakeFromNib{

    printf("[awakeFromNib]\n");

    [self startScreen];
}

这是输出:

[settings]: button pressed
[initWithWindowNibName]
about to load
[awakeFromNib]
[awakeFromNib]

分析调用堆栈,第一次由[NSObject performSelector:]调用第二个[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:]

有人能说出我做错了什么吗?

由于

2 个答案:

答案 0 :(得分:3)

Config_SelectorSetup.xib除文件所有者外还包含Config_SelectorSetup个对象吗?

尝试在self -

中记录awakeFromNib
NSLog(@"self = %p", self);

每次都打印相同的地址吗?如果它正在打印不同的地址,则您的笔尖中可能有Config_SelectorSetup个对象。

答案 1 :(得分:0)

您的课程中有多少个出口,该课程的子课程是什么?我找到了某些子类(例如NSDocument),如果连接了多个出口,则每个nib对象将在加载时触发awakeFromNib方法。 NSLog您的网点,看看他们输出的是否为零或地址。