首页 > 解决方案 > 如何确保新的视图控制器对用户可见?

问题描述

首先,本机 macOS 应用程序在启动后 3 秒被制作成一个附件类型的应用程序(首先显示一个信息屏幕,在应用程序进入系统菜单栏之前):

DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
    NSApplication.shared.setActivationPolicy(.accessory)
}

它有一个创建状态栏菜单:

class func createMenu(color: Bool) -> Void {
    let statusBar = NSStatusBar.system
    self.sharedInstance.storedStatusItem = statusBar.statusItem(withLength: NSStatusItem.variableLength)
    self.sharedInstance.storedStatusItem.menu = ABCMenu.statusBarMenu()
}

用户在状态栏菜单中有几个选项可以打开带有控件的不同屏幕。其中之一显示为:

class func showServiceViewController() -> Void {

    let storyboard = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: Bundle.main)
    guard let vc = storyboard.instantiateController(withIdentifier: "ABCServiceViewController") as? ABCServiceViewController, let checkedWindow = ABCUIManager.sharedInstance.window else {
        return
    }

    checkedWindow.contentViewController = vc
    checkedWindow.setIsVisible(true)
    checkedWindow.orderFrontRegardless()
}

问题是有时选择的视图控制器没有被带到后台,并且必须在许多其他已经打开的应用程序和窗口下找到。大多数时候它工作正常,但并非总是如此。

有没有更好的方法来确保新的视图控制器总是被提升到最高级别并显示给用户?

感谢您的任何建议。

标签: swiftmacoscocoaswift5

解决方案


我会在显示窗口之前激活应用程序(因为您有附件应用程序,默认情况下它没有激活,必须以编程方式完成)

   ...
    NSApplication.shared.activate(ignoringOtherApps: true)

    checkedWindow.contentViewController = vc
    checkedWindow.setIsVisible(true)
    checkedWindow.orderFrontRegardless()
}

推荐阅读