0

NSWindow在 Interface Builder 中进行了设置。我已将 class of 设置File's Owner为 my并将控制器的属性NSWindowController链接到 my . 我的控制器实现.windowNSWindowNSWindowDelegate

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

- (void)windowDidLoad
{
    [super windowDidLoad];

    [self.window setDelegate:self];
}

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

仍然,-windowDidBecomeMain:不叫。有人知道为什么是这样吗?

编辑

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

现在,下面的代码没有显示窗口,我不知道为什么。

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

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

4

1 回答 1

0

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

当您在界面构建器中更改类时,您会告诉它哪些出口和操作可用(这就是您能够拖动到窗口出口的原因),但您仍然负责自己传递这个对象。

对于非基于文档的应用程序,您将拥有一个调用NSApplicationMain. 这基本上是查找并加载在 info.plist 文件中指定的窗口笔尖,并将当前NSApplication实例作为文件所有者传递给该笔尖(因此,即使您将类类型更改为NSWindowController,传入的对象也是实际上是 NSApplication 类型)。

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

您应该-windowDidBecomeMain:在您的应用程序委托中实现该方法。然后 Ctrl+从您的窗口拖动到您的 appDelegate 以将其设置为窗口的代表以获取您的通知。

更新

回答您关于WindowController提防以下两个问题的问题:

  1. 您正在您的applicationDidFinishLaunching:方法中创建窗口控制器变量 (dwc)。当您离开带有窗口的方法时,它就会被释放。创建一个实例变量来代替窗口控制器。
  2. 确保您的第二个窗口 nib 的文件所有者设置为 NSWindowController(或您的窗口控制器类型),并且它的窗口出口连接到 nib 文件中的窗口。

您的窗口现在应该显示。

于 2012-06-17T18:32:35.020 回答