我在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
是应用程序委托。
答案 0 :(得分:0)
我怀疑您的问题是由于您的窗口控制器实际上不是nibs文件所有者的对象。
当您更改界面构建器中的类时,您会告诉它可用的插座和操作(这就是您可以拖动到窗口的原因),但您仍然有责任自己传递此对象。
对于非基于文档的应用程序,您将拥有一个调用NSApplicationMain
的main方法。这样做基本上是查找并加载info.plist文件中指定的窗口nib,并将当前NSApplication
实例作为文件所有者传递给此nib(因此即使您将类类型更改为{{ 1}},传入的对象实际上是NSApplication类型。
解决问题的最简单方法是暂时摆脱你的窗口控制器(因为它实际上还没有做任何事情)。
您应该在应用代理中实施NSWindowController
方法。然后按住Ctrl并从窗口拖动到appDelegate,将其设置为窗口的委托,以获取通知。
<强>更新强>
要回答有关-windowDidBecomeMain:
提防以下两个问题的问题:
WindowController
方法中创建窗口控制器变量(dwc)。这是在你离开方法的时候发布的。创建一个实例变量来代替窗口控制器。现在应该显示您的窗口。