Как убедиться, что новый контроллер представления виден пользователю? - PullRequest
2 голосов
/ 05 февраля 2020

Прежде всего, собственное приложение macOS превращается в приложение вспомогательного типа через 3 секунды после запуска (чтобы сначала отобразить информационный экран, прежде чем приложение войдет в строку системного меню):

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

It имеет меню строки состояния, созданное с помощью:

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()
}

Проблема в том, что иногда выбранный контроллер представления не переводится в фоновый режим и должен находиться под многими другими уже открытыми приложениями и windows. В большинстве случаев он работает нормально, но не всегда.

Существуют ли более эффективные способы обеспечения того, чтобы новый контроллер представления всегда поднимался до самого высокого уровня и показывался пользователю?

Спасибо за любые предложения.

1 Ответ

1 голос
/ 05 февраля 2020

Я бы активировал приложение перед отображением окна (поскольку у вас есть дополнительное приложение, оно не активируется по умолчанию и должно выполняться программно)

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

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