gpt4 book ai didi

swift - 如何在使用菜单栏项关闭和重新打开时隐藏 macOS 应用程序窗口?

转载 作者:行者123 更新时间:2023-12-04 07:58:54 31 4
gpt4 key购买 nike

我正在开发一个 macOS 应用程序(使用 Swift 和 Storyboard),其窗口的行为类似于 Adob​​e Creative Cloud 应用程序。经过数小时的研究,我找不到最佳解决方案。
这意味着:

  • 当应用程序启动时,主窗口会在状态栏上显示各种菜单,dock 中会出现一个图标,状态栏中会出现一个图标。
  • 当用户点击红色的 X 时,主窗口和 Dock 中的图标被隐藏。
  • 单击状态栏图标可以重新打开主应用程序窗口。并且停靠图标重新出现。

  • 我的 Storyboard看起来像这样:
    enter image description here
    我尝试了以下方法:
  • 通过设置 Application is agent (UIElement)YES ,我能够关闭主应用程序窗口,同时保持应用程序处于事件状态。但是,dock 中没有显示应用程序图标,状态栏左侧也没有菜单。
  • 我可以通过单击状态栏图标来启动一个新的应用程序窗口。但是这样做只会打开一个全新的窗口,而不管是否已经显示了一个窗口(我只希望显示一个窗口)。
  • let storyboard = NSStoryboard(name: "Main", bundle: nil)
    guard let window = storyboard.instantiateController(withIdentifier: .init(stringLiteral: "main")) as? WindowController else { return }
    window.showWindow(self)
    非常感谢任何可以提供帮助的人!

    最佳答案

    不要使用 Application is agent方法,但更改 activationPolicyNSApp .
    要在关闭(最后一个)窗口后动态隐藏图标,请在您的 AppDelegate 中使用它:

    func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
    NSApp.setActivationPolicy(.accessory)
    return false
    }
    并使用与此类似的东西来初始化您的菜单栏图标并激活包含停靠栏图标的窗口:
    class ViewController: NSViewController {

    var status: NSStatusItem?

    override func viewDidLoad() {
    super.viewDidLoad()

    status = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
    status?.button?.title = "Test"
    status?.button?.action = #selector(activateWindow(_:))
    status?.button?.target = self
    }

    @IBAction func activateWindow(_ sender: AnyObject) {
    NSApp.setActivationPolicy(.regular)
    DispatchQueue.main.async {
    NSApp.windows.first?.orderFrontRegardless()
    }
    }
    }

    关于swift - 如何在使用菜单栏项关闭和重新打开时隐藏 macOS 应用程序窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66567131/

    31 4 0