2

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

NSWindowController我有一个应用程序,它使用和打开几个子窗口(在加载主/父窗口之后)initNibWIthName:。这工作正常。

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

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

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

我想我正在寻找类似于 WindowsWM_CLOSE类型消息的东西。

4

3 回答 3

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 之间的概念差异。

于 2009-10-06T05:54:45.777 回答
3

windowWillClose:

苹果开发者文档 NSWindowDelegate

于 2009-10-05T11:58:28.190 回答
2

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

如果你有一个单窗口界面,有一个主窗口,除了 About、Preferences 等没有其他窗口,那么你应该applicationShouldTerminateAfterLastWindowClosed:在你的应用程序中实现 delegate 和 return YES。这是关闭窗口导致应用程序退出的唯一方法(除了您手动执行之外)。

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

于 2009-10-05T22:05:44.440 回答