代码之家  ›  专栏  ›  技术社区  ›  Frank

关闭主窗口时用可可粉关闭子窗口

  •  2
  • Frank  · 技术社区  · 15 年前

    我是可可新手,所以我的方法可能是错误的,但是…

    我有一个应用程序,它使用 NSWindowController initNibWIthName: . 这很管用。

    但当我关闭父窗口(使用红色x)时,这些窗口将保持打开状态,并防止应用程序在关闭之前关闭。这是有道理的,因为我不会把他们关在任何地方。

    但我该怎么做呢?在这一点上一定有一个事件被调用,但我在任何地方都找不到它是什么。

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

    我想我在找和窗户相似的东西 WM_CLOSE 键入消息。

    3 回复  |  直到 13 年前
        1
  •  4
  •   Jeremy W. Sherman    14 年前

    最接近的等价物是 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提到的delegate方法对于委托来说是一种方便的方法,它省去了注册他们可能需要的通知的麻烦。您不需要创建一个窗口控制器来接收该消息;只需发送窗口 [window setDelegate:myObject] 将导致 myObject 接受 -windowWillClose: 如果它响应方法,则返回消息。

    顺便说一下,科科所说的“儿童窗”与你所想的不同。他们没有在 Window Programming Guide ,但如果您查看文档中有关 NSWindow ,您将看到它们基本上跟踪父窗口的移动,以便它们随父窗口一起移动。

    如果你是从win32编程来cocoa的,你可能会发现苹果的 Porting to Mac OS X from Windows Win32 API 有助于突出win32和cocoa之间的概念差异。

        2
  •  3
  •   Monolo    13 年前
        3
  •  2
  •   Peter Hosey    15 年前

    windows和应用程序在mac os x中不是一回事。

    如果您只有一个窗口界面,有一个主窗口,除了about、preferences等,没有其他窗口,那么您应该实现 applicationShouldTerminateAfterLastWindowClosed: 在您的申请委托和返回中 YES . 这是关闭窗口导致应用程序退出的唯一方法(除了手动操作)。

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

    推荐文章