【问题标题】:How to make a specific window have privilege to quit the app after closing its last window but not the whole app?如何使特定窗口有权在关闭其最后一个窗口而不是整个应用程序后退出应用程序?
【发布时间】:2019-03-12 02:41:29
【问题描述】:

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

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

但似乎它适用于整个应用程序在最后一个窗口关闭后退出应用程序。

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

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

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

但还是什么都没发生……

所以我想问有没有办法做到这一点?

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

附:我正在使用 Xcode 10 和 Swift 4.2 Cocoa API

【问题讨论】:

    标签: macos cocoa appdelegate xcode10 swift4.2


    【解决方案1】:

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

    当应用程序的最后一个窗口关闭时,应用程序会将此消息发送给您的委托。

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

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

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

    【讨论】:

    • 所以,我只需要在applicationShouldTerminateAfterLastWindowClosed(_:) 下添加类似if 语句或switch 语句来确定是否退出?或者,我该怎么办?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      相关资源
      最近更新 更多