我的应用程序中有多个窗口控制器,但我想只有一些窗口控制器在最后一个窗口关闭后退出应用程序。我尝试在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)
}
}
但是,没有发生任何事......
所以我想问有没有办法实现这个目标?
如果没有,那么我问是否有任何方法告诉应用程序在我以编程方式关闭窗口的特定时间不退出?
附:我正在使用Xcode 10和Swift 4.2 Cocoa API
docs for applicationShouldTerminateAfterLastWindowClosed
说,在做出决定时(每次)都会调用它:
应用程序的最后一个窗口关闭时,应用程序将此消息发送给您的代理。
这可以让你在不同的情况下给出不同的答案。
(您可能认为它只会在应用程序生命周期的早期调用一次,并指示应用程序整个生命周期的行为。)
因此,您可以向您的应用代表传达您正在进行窗口转换(或以其他方式计划很快打开窗口)这一事实。只要情况如此,它就可以从applicationShouldTerminateAfterLastWindowClosed
返回false。当然,在完成转换后,您必须告诉它恢复正常行为。
我找到了一种方法来实现这一点,通过applicationShouldTerminateAfterLastWindowClosed
在AppDelegate
中实现return true
,然后在所有视图控制器类中实现windowShouldClose(_sender:)
,我想确定窗口是否应该关闭(应用程序应该退出,因为applicationShouldTerminateAfterLastWindowClosed
总是返回true
)窗口收到performClose(_:)
消息。现在,一切都很完美。