我是Cocoa的新手,所以很可能我的做法错了,但是......
我有一个应用程序,它使用NSWindowController
和initNibWIthName:
打开几个子窗口(在加载主/父窗口之后)。这很好。
但是当我关闭父窗口(使用红色x)时,它们会保持打开状态并阻止应用程序关闭,直到它们关闭为止。这是有道理的,因为我没有把它们关在任何地方。
但是我该怎么做?此时必须有一个被调用的事件,但我无法找到它在任何地方的内容。
仅在应用程序实际终止时才调用applicationWillTerminate
(等等)通知,而不是在按下关闭按钮时调用。
我想我正在寻找类似于Windows WM_CLOSE
类型消息的内容。
答案 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)
windowWillClose:
答案 2 :(得分:2)
Windows和应用程序在Mac OS X中不是一回事。
如果你有一个单窗口界面,有一个主窗口,除了About,Preferences等之外没有其他界面,那么你应该在你的应用程序委托中实现applicationShouldTerminateAfterLastWindowClosed:
并返回YES
。这是除了你手动完成之外的唯一方法,关闭窗口会导致应用程序退出。
如果您有一个多窗口界面(如在典型的基于文档的应用程序中),那么您应该使所有这些窗口彼此对等。检查器和工具选项板等Windows应该是浮动面板,而不是常规窗口。关闭最后一个窗口永远不应该退出这样的应用程序。