接收窗口通知

时间:2012-06-17 16:15:37

标签: macos cocoa

我在Interface Builder中设置了NSWindow。我已将File's Owner的类设置为NSWindowController,并将控制器的window属性与我的NSWindow相关联。 我的控制器实现了NSWindowDelegate

现在,在我的控制器中,我添加了以下内容:

- (void)windowDidLoad
{
    [super windowDidLoad];

    [self.window setDelegate:self];
}

- (void)windowDidBecomeMain:(NSNotification *)notification
{
    NSLog(@"Did become main.");
}

仍然没有调用-windowDidBecomeMain:。有谁知道这是为什么?

修改

尝试在发布时显示AppDelegate的窗口。主nib(在Info.plist中声明)仅包含一个链接到AppDelegate的菜单项。在应用程序委托中,我在状态栏上显示一个图标,当单击此图标时,我将显示主笔尖中的菜单。 在应用程序委托中,我还想显示一个窗口,该窗口应该分配一个窗口控制器来处理逻辑。 我相信当这个工作时,我会收到我的窗口通知。

现在,以下代码没有显示窗口,我无法弄清楚原因。

DemoWindowController *dwc = [[DemoWindowController alloc] initWithWindowNibName:@"DemoWindowController"];
[dwc showWindow:self];

请注意,self是应用程序委托。

1 个答案:

答案 0 :(得分:0)

我怀疑您的问题是由于您的窗口控制器实际上不是nibs文件所有者的对象。

当您更改界面构建器中的类时,您会告诉它可用的插座和操作(这就是您可以拖动到窗口的原因),但您仍然有责任自己传递此对象。

对于非基于文档的应用程序,您将拥有一个调用NSApplicationMain的main方法。这样做基本上是查找并加载info.plist文件中指定的窗口nib,并将当前NSApplication实例作为文件所有者传递给此nib(因此即使您将类类型更改为{{ 1}},传入的对象实际上是NSApplication类型。

解决问题的最简单方法是暂时摆脱你的窗口控制器(因为它实际上还没有做任何事情)。

您应该在应用代理中实施NSWindowController方法。然后按住Ctrl并从窗口拖动到appDelegate,将其设置为窗口的委托,以获取通知。

<强>更新

要回答有关-windowDidBecomeMain:提防以下两个问题的问题:

  1. 您正在WindowController方法中创建窗口控制器变量(dwc)。这是在你离开方法的时候发布的。创建一个实例变量来代替窗口控制器。
  2. 确保第二个窗口笔尖的文件所有者设置为NSWindowController(或窗口控制器类型),并且其窗口出口连接到nib文件中的窗口。
  3. 现在应该显示您的窗口。