Открыть и вывести новое окно на передний план при нажатии NSMenuItem

У меня есть приложение меню macOS, которое работает как агент (LSUIElement).

Мне нужно, чтобы у него было окно настроек компаньона. В NSMenu есть настройки NSMenuItem, и требуется открыть фактическое окно и вывести его на передний план при нажатии.

Окно управляется SwiftUI. Вот как это работает:

// main is an NSMenu
        main.addItem(
            withTitle: "Settings",
            action: #selector(AppDelegate.openSettings),
            keyEquivalent: "")
    @objc func openSettings() {
        let detailView = SettingsWindow(); // Swift UI view
        let controller = DetailWindowController(rootView: detailView) // See below
        controller.window?.title = "Settings";
        controller.showWindow(nil)
        NSApp.activate(ignoringOtherApps: true)
    }
class DetailWindowController<RootView : View>: NSWindowController {
    convenience init(rootView: RootView) {
        let hostingController = NSHostingController(rootView: rootView.frame(width: 400, height: 500))
        let window = NSWindow(contentViewController: hostingController)
        window.setContentSize(NSSize(width: 400, height: 500))
        self.init(window: window)
    }
}

Что на самом деле происходит

Текущее поведение заключается в том, что окно открывается, однако оно всегда позади любых других окон, находящихся в данный момент на переднем плане.

Мне нужно, чтобы он был на переднем плане.

NSApp.activate(ignoringOtherApps: true) в приведенном выше коде — это попытка добиться этого, но это не сработало.

Любая помощь была бы потрясающей. Большое спасибо.


person Chris    schedule 20.02.2021    source источник


Ответы (1)


Разобрался в итоге. Мне понадобились эти 3. Политика активации должна лучше управляться, но для чего это стоит, вот что работает.

NSApp.setActivationPolicy(.regular)
NSApp.activate(ignoringOtherApps: true)
settingsWindow!.window?.orderFrontRegardless()

В контексте

@objc func openSettings() {
    if(settingsWindow == nil) {
        let detailView = ActionWindow();
        settingsWindow = DetailWindowController(rootView: detailView)
        settingsWindow!.window?.title = "Cloud Brains - Settings";
        settingsWindow!.showWindow(nil)
    }
    NSApp.setActivationPolicy(.regular)
    NSApp.activate(ignoringOtherApps: true)
    settingsWindow!.window?.orderFrontRegardless()
}
person Chris    schedule 20.02.2021