如何让特定 window 有权在关闭其最后一个 window 而不是整个应用程序后退出该应用程序?

How to make a specific window have privilege to quit the app after closing its last window but not the whole app?

我的应用程序中有多个 window 控制器,但我只希望部分 window 控制器在最后一个 window 关闭后退出应用程序。 我尝试在 AppDelegate.swift 文件中添加 applicationShouldTerminateAfterLastWindowClosed(_:)

func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
    return true
}

但在上次 window 关闭后退出应用程序似乎对整个应用程序有效。

我想要实现这一点的原因是我在我的应用程序中的一些转换包括关闭 window 并使用 self.view.window!.close() 或 [=17= 显示新的 window 】,一旦调用这些函数,应用程序立即退出。所以,我不希望applicationShouldTerminateAfterLastWindowClosed(_:)申请整个申请。

我尝试在调用函数之前使用 exampleWindowController.showWindow(self) 来关闭之前的 window,但仍然没有用,它仍然终止了我的应用程序。我还尝试使用 NSWindowDelegate 中的 windowShouldClose(_:) 告诉应用程序在针对特定 window 控制器关闭 window 后退出(我可能对如何正确使用有一些误解这个函数):

extension exampleWindowController: NSWindowDelegate {
    func windowWillClose(_ notification: Notification) {
        NSApp.terminate(self)
    }
}

但是,还是什么都没发生...

所以我想问一下有什么办法可以做到这一点吗?

如果没有,那么我问是否有任何方法可以告诉应用程序在我以编程方式关闭 window?

的特定时间不要退出

P.S。我正在使用 Xcode 10 和 Swift 4.2 Cocoa API

docs for applicationShouldTerminateAfterLastWindowClosed 表示在做出决定时调用它(每次):

The application sends this message to your delegate when the application’s last window is closed.

这让你在不同的情况下给出不同的答案。

(您可能认为它只会在应用程序生命周期的早期调用一次,并决定应用程序整个生命周期的行为。)

因此,您可以将您正在进行 window 转换(或计划很快打开 window)这一事实告知您的应用程序委托。只要是这种情况,它就可以从 applicationShouldTerminateAfterLastWindowClosed return 为假。当然,完成转换后,您必须告诉它 return 正常行为。

我找到了一种方法来实现这一点,方法是在 AppDelegate 中使用 return true 实现 applicationShouldTerminateAfterLastWindowClosed,然后在所有视图控制器 [=21] 中实现 windowShouldClose(_sender:) =] 当 window 收到 performClose(_:) 时,我想确定 window 是否应该关闭(应用程序应该退出,因为 applicationShouldTerminateAfterLastWindowClosed 总是返回 true)信息。 现在,一切正常。