Как разместить NSPopover в приложении строки состояния (macOS)

#macos #swiftui #popover

Вопрос:

Я создал приложение строки состояния macOS с помощью SwiftUI, и у меня, наконец, все работает так, как я хочу. Единственная проблема в том, что, когда я использую его на весь экран, строка состояния скрывается, а всплывающее меню отключается. Есть какие-нибудь идеи?

Как приложение отключается

Мое приложение.свифт:

 import SwiftUI

@main
struct MyApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var delegate;
    var body: some Scene {
        Settings {
            ContentView()
        }
    }
}

class AppDelegate: NSObject,NSApplicationDelegate {
    var statusItem: NSStatusItem!
    var popOver: NSPopover!
    
    func applicationDidFinishLaunching(_ notification: Notification){
        let contentView = ContentView()
        let popOver = NSPopover();
        popOver.behavior = .transient
        popOver.animates = true
        popOver.contentViewController = NSHostingController(rootView: contentView)
        popOver.setValue(true, forKeyPath: "shouldHideAnchor")
        
        self.popOver = popOver
        self.statusItem = NSStatusBar.system.statusItem(withLength: CGFloat(NSStatusItem.variableLength))
        
        if let MenuButton = self.statusItem.button {
            MenuButton.image = NSImage(systemSymbolName: "display.2", accessibilityDescription: nil)
            MenuButton.action = #selector(MenuButtonToggle)
        }
    }
    
    @objc func MenuButtonToggle(_ sender: AnyObject){
        if let button = self.statusItem.button {
            if self.popOver.isShown{
                self.popOver.performClose(sender)
            }else {
                self.popOver.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY)
                self.popOver.contentViewController?.view.window?.makeKey()
            }
        }
    }
}
 

Комментарии:

1. «когда я использую его в полноэкранном режиме, строка состояния скрывается, а всплывающее меню отключается», Вы показываете скриншот за набор, но не объясняете, что там происходит. Какая из них является вашей кнопкой в строке состояния?