在关闭最后一个窗口而不是整个应用程序后,如何使特定窗口有权退出该应用程序?

时间:2018-10-07 03:05:12

标签: macos cocoa appdelegate xcode10 swift4.2

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

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

但是在上一个窗口关闭后,似乎整个应用程序都可以退出该应用程序。

我要实现此目的的原因是,我在应用程序中进行的某些转换包括使用self.view.window!.close()NSApp.mainWindow!.close()关闭窗口并显示新窗口,一旦调用了这些函数,该应用程序立即退出。因此,我不希望将applicationShouldTerminateAfterLastWindowClosed(_:)应用于整个应用程序。

在调用函数以关闭上一个窗口之前,我曾尝试使用exampleWindowController.showWindow(self),但仍然无法正常工作,但仍终止了我的应用程序。我还尝试使用windowShouldClose(_:)中的NSWindowDelegate通知应用程序在特定窗口控制器关闭窗口后退出(我可能对如何正确使用此功能有误解):

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

但还是什么也没发生...

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

如果没有,那么我问是否可以通过某种方式告诉应用程序在以编程方式关闭窗口的特定时间不要退出?

P.S。我正在将Xcode 10与Swift 4.2 Cocoa API结合使用

2 个答案:

答案 0 :(得分:0)

docs for applicationShouldTerminateAfterLastWindowClosed说它是在决策时(每次)被调用的:

  

在应用程序的最后一个窗口关闭时,应用程序将此消息发送给您的代表。

这使您可以在不同情况下给出不同的答案。

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

因此,您可以将正在进行窗口转换(或计划不久后打开窗口)的事实传达给应用程序委托。只要是这种情况,它就可以从applicationShouldTerminateAfterLastWindowClosed返回false。当然,完成转换后,您必须告诉它恢复正常行为。

答案 1 :(得分:0)

我想出了一种方法,可以通过在applicationShouldTerminateAfterLastWindowClosed中实现AppDelegate中的return true,然后在我想要的所有视图控制器类中实现windowShouldClose(_sender:)确定当窗口接收到applicationShouldTerminateAfterLastWindowClosed消息时是否关闭窗口(由于true总是返回performClose(_:),因此应用程序应该退出)。 现在,一切正常。