当主窗口关闭时,关闭Cocoa中的子窗口

时间:2009-10-05 11:32:49

标签: objective-c windows cocoa nswindowcontroller

我是Cocoa的新手,所以很可能我的做法错了,但是......

我有一个应用程序,它使用NSWindowControllerinitNibWIthName:打开几个子窗口(在加载主/父窗口之后)。这很好。

但是当我关闭父窗口(使用红色x)时,它们会保持打开状态并阻止应用程序关闭,直到它们关闭为止。这是有道理的,因为我没有把它们关在任何地方。

但是我该怎么做?此时必须有一个被调用的事件,但我无法找到它在任何地方的内容。

仅在应用程序实际终止时才调用applicationWillTerminate(等等)通知,而不是在按下关闭按钮时调用。

我想我正在寻找类似于Windows WM_CLOSE类型消息的内容。

3 个答案:

答案 0 :(得分:4)

您找到的最接近的等价物是窗口在关闭之前发布的NSWindowWillCloseNotification。当父窗口关闭时,您可以让子窗口关闭:

NSWindow *parentWindow;
NSArray *childWindows;

NSNotificationCenter *noteCenter = [NSNotificationCenter defaultCenter];
for (NSWindow *childWindow in childWindows) {
  [noteCenter
   addObserver:childWindow selector:@selector(close)
   name:NSWindowWillCloseNotification object:parentWindow];
}

如果子窗口将在其父窗口之前被释放,请确保在此之前取消注册以获取通知。

Mark提到的委托方法是委托的一种便捷方法,可以为他们省去注册他们可能想要的通知的麻烦。您不需要创建窗口控制器只是为了接收该消息;简单地发送窗口[window setDelegate:myObject]会导致myObject收到-windowWillClose:消息,如果它响应该方法。

顺便说一下,Cocoa所谓的“儿童之窗”与你的想法不同。它们没有在Window Programming Guide中解决,但如果您查看NSWindow上相关方法的文档,您会看到它们基本上跟踪其父窗口的移动,以便它们移动用它。

如果你是从Win32编程来到Cocoa,你可能会发现Apple的Porting to Mac OS X from Windows Win32 API有助于强调Win32和Cocoa之间的概念差异。

答案 1 :(得分:3)

答案 2 :(得分:2)

Windows和应用程序在Mac OS X中不是一回事。

如果你有一个单窗口界面,有一个主窗口,除了About,Preferences等之外没有其他界面,那么你应该在你的应用程序委托中实现applicationShouldTerminateAfterLastWindowClosed:并返回YES。这是除了你手动完成之外的唯一方法,关闭窗口会导致应用程序退出。

如果您有一个多窗口界面(如在典型的基于文档的应用程序中),那么您应该使所有这些窗口彼此对等。检查器和工具选项板等Windows应该是浮动面板,而不是常规窗口。关闭最后一个窗口永远不应该退出这样的应用程序。