Macos 接收窗口通知
我在Interface Builder中设置了一个Macos 接收窗口通知,macos,cocoa,Macos,Cocoa,我在Interface Builder中设置了一个NSWindow。我已将文件所有者的类别设置为myNSWindowController,并将控制器的窗口属性链接到myNSWindow。 我的控制器实现了NSWindowDelegate 现在,在我的控制器中,我添加了以下内容: - (void)windowDidLoad { [super windowDidLoad]; [self.window setDelegate:self]; } - (void)windowDidBe
NSWindow
。我已将文件所有者的类别设置为myNSWindowController
,并将控制器的窗口属性链接到myNSWindow
。
我的控制器实现了NSWindowDelegate
现在,在我的控制器中,我添加了以下内容:
- (void)windowDidLoad
{
[super windowDidLoad];
[self.window setDelegate:self];
}
- (void)windowDidBecomeMain:(NSNotification *)notification
{
NSLog(@"Did become main.");
}
不过,-windowDidBecomeMain:
未被调用。有人知道这是为什么吗
编辑:
尝试在启动时从AppDelegate
显示窗口。主nib(在Info.plist
中声明)仅包含链接到AppDelegate
的菜单项。在applicationdelegate中,我在状态栏上显示一个图标,单击该图标时,我将显示主nib中的菜单。
在applicationdelegate中,我还想显示一个窗口,该窗口应该分配一个窗口控制器来处理逻辑。
我相信,当这项工作,我会收到我的窗口通知
现在,下面的代码没有显示窗口,我不知道为什么
DemoWindowController *dwc = [[DemoWindowController alloc] initWithWindowNibName:@"DemoWindowController"];
[dwc showWindow:self];
请注意,self
是应用程序委托。我怀疑您的问题是因为您的窗口控制器实际上不是nibs文件所有者的对象
当您在interface builder中更改类时,您会告诉它哪些出口和操作可用(这就是为什么您可以拖动到窗口出口),但您自己仍负责传递此对象
对于非基于文档的应用程序,您将有一个调用NSApplicationMain
的main方法。这主要是查找并加载info.plist文件中指定的窗口nib,并将当前的NSApplication
实例作为文件所有者传递给该nib(因此,即使将类类型更改为NSWindowController
,传递的对象实际上是NSApplication类型)
解决问题的最简单方法是暂时摆脱窗口控制器(因为它实际上还没有做任何事情)
您应该在应用程序委托中实现-windowDidBecomeMain:
方法。然后按住Ctrl键并将其从窗口拖动到appDelegate,将其设置为窗口的代理以获取通知
更新
要回答有关WindowController
的问题,请注意以下两个问题:
您正在ApplicationIDFinishLaunching:
方法中创建窗口控制器变量(dwc)。当您离开该方法并带着它打开窗口时,它就会被释放。创建一个实例变量以保留窗口控制器
确保第二个窗口nib的文件所有者设置为NSWindowController(或窗口控制器类型),并且其窗口出口连接到nib文件中的窗口
您的窗口现在应该显示。您的窗口控制器实际上是打开窗口的对象吗?如果不是,那么你的文件所有者将无法正确设置。我对Mac OS开发非常陌生,但已经做了几年的iOS开发。老实说,我很难弄清楚窗口控制器的角色和应用程序委托的角色。对于iOS和Mac OS来说,情况似乎不一样。我从AppDelegate
实例化窗口控制器。这就是我没有收到通知的原因,你能告诉我应该做些什么吗?你的应用程序是否是基于文档的应用程序?不,不是。我根本不使用NSDocument
课程。我认为你引导我走上了正确的道路。我想从我的AppDelegate
中显示一个窗口,以便在启动时显示此窗口。我的主nib(在Info.plist
中声明)仅包含一个菜单项。我已经创建了一个新的nib文件,希望添加一个窗口控制器来处理这个窗口的逻辑。在我的'AppDelegate'中,我试图显示一个新窗口(请参见我的原始问题),但该窗口没有显示。你知道为什么会这样吗?我相信当窗口显示时,它将分配我的窗口控制器,并且我将收到窗口通知。您是否告诉您的WindowController
要加载哪个nib文件?通常的方法是调用–initWithWindowNibName:
传入nib文件的名称。是的,我确实传入了nib的名称。在我最初的问题中,我演示了如何初始化窗口控制器以及如何尝试显示窗口。在-applicationdFinishLaunching:
尝试调用[YourWindowController window]代码>。