Cocoa 为什么我必须在10.5上两次调用NSWindowController上的showWindow?

Cocoa 为什么我必须在10.5上两次调用NSWindowController上的showWindow?,cocoa,nswindow,nswindowcontroller,showwindow,Cocoa,Nswindow,Nswindowcontroller,Showwindow,我有一个NSWindowController的子类,用于从nib加载窗口并在屏幕上显示。下面是我想显示窗口时调用的代码。在10.6上,当调用showCustomWindow时,将显示窗口,但在10.5上,必须调用此方法两次才能显示窗口 -(IBAction)showCustomWindow:(id)sender { if(!windowController){ windowController = [[MyWindowController alloc] initWithWi

我有一个NSWindowController的子类,用于从nib加载窗口并在屏幕上显示。下面是我想显示窗口时调用的代码。在10.6上,当调用showCustomWindow时,将显示窗口,但在10.5上,必须调用此方法两次才能显示窗口

-(IBAction)showCustomWindow:(id)sender 
{
   if(!windowController){
       windowController = [[MyWindowController alloc] initWithWindowNibName:@"MyWindow"];
    }

    [windowController showWindow:self];
}
该窗口已选中和取消选中“启动时可见”,这似乎没有什么区别

编辑:我意识到我遇到的问题与我的NSWindowController或showWindow无关。我把它设置正确了。然而,我发现并不是所有的类都实现awakeFromNib。在我的一个NSView子类中(在我试图加载的nib中),我调用了[super awakeFromNib],它给了我一个“不响应选择器”(但仅在10.5上,这很奇怪)。因此,我本可以去掉[super awakeFromNib],但我选择了希望更坚固的:

if([NSView instancesRespondToSelector:@selector(awakeFromNib)]) {
    [super awakeFromNib];
}

这使我的笔尖可以正常加载,showWindow也可以正常工作。

在窗口从笔尖加载完毕之前,您是否正在调用-showWindow?您可能需要在[MyWindowController awakeFromNib]中设置一个断点来找到答案。

编辑:好的,很抱歉我误解了您的问题,您需要调用showWindow两次。我没有答案


您看到的行为是正确的,因为方法
initWithWindowNibName:
实际上不会加载nib。Nib加载缓慢进行。。因此,在调用要求加载nib的
showWindow
方法或其他方法(如
window
)后,如果要使用
-showWindow:
控制窗口可见性的计时,则应取消选中启动时可见的

其他一切似乎都与您向我们展示的内容相符,因此这只是一个猜测,但您是否忘记将文件所有者对象上的
窗口
出口连接到nib中的窗口?

文档内容如下:“只有当您确定您的超类提供了一个实现时,才应该调用awakeFromNib的超级实现。由于应用程序工具包不提供awakeFromNib方法的默认实现,因此如果父类未实现super,则调用super会导致异常。直接父类为NSObject或NSView的类不需要调用超级实现。”换句话说,如果它只是NSView子类,就不用麻烦在超级上调用它。