【问题标题】:Why do I have to call showWindow on my NSWindowController twice on 10.5?为什么我必须在 10.5 上调用我的 NSWindowController 上的 showWindow 两次?
【发布时间】: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


【解决方案1】:

如果您想使用-showWindow: 来控制该窗口的可见性时间,则应取消选中在启动时可见。

其他一切似乎与您向我们展示的内容一样,所以这只是一个猜测,但是您是否忘记将文件所有者对象上的window 插座连接到您笔尖的窗口?

【讨论】:

    【解决方案2】:

    您是否在窗口完成从其笔尖加载之前调用 -showWindow?你可能想在 [MyWindowController awakeFromNib] 中设置一个断点来找出答案。

    【讨论】:

      【解决方案3】:

      编辑:好的对不起,我误解了你的问题,看到你需要调用 showWindow 两次。我没有答案。

      您看到的行为是正确的,因为 initWithWindowNibName: 方法实际上不会加载笔尖。 Nib 加载是延迟发生的。所以在调用 showWindow 方法或其他需要加载 nib 的方法(例如 window)之后。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-16
        相关资源
        最近更新 更多