【发布时间】:2009-10-07 02:49:26
【问题描述】:
我有一个 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];
}
这让我的 nib 可以正常加载,并且 showWindow 可以正常工作。
【问题讨论】:
-
文档如下:“只有当您确定您的超类提供了实现时,您才应该调用 awakeFromNib 的超级实现。因为 Application Kit 不提供 awakeFromNib 方法的默认实现,如果父类没有实现,调用super会导致异常。直接父类为NSObject或NSView的类不需要调用super实现。换句话说,如果它只是一个 NSView 子类,就不要在 super 上调用它。
标签: cocoa nswindow nswindowcontroller showwindow