打开已关闭且在Dock中不可见的SwiftUI应用的主窗口

mkshixfv  于 2023-03-28  发布在  Swift
关注(0)|答案(2)|浏览(123)

我正在SwiftUI中开发一个应用程序,它有一个主窗口,但也有一个MenuBarExtra。在设置中,有一个选项可以从Dock隐藏主窗口(这是我的应用程序的一个功能,应用程序只能在菜单栏中运行)。
一旦窗口被关闭,我希望用户能够重新打开它。
我添加了以下代码:

@main
struct MyApp : App
{
    @Environment(\.openWindow) private var openWindow
    
    @AppStorage(SettingsKeys.showInMenuBar) var showInMenuBar = false
    
    @StateObject var viewModel = MainViewModel()
    
    var body: some Scene {
        WindowGroup(id: "MainWindow") {
            ContentView(viewModel: self.viewModel)
        }
        .windowToolbarStyle(.unified)
        
        MenuBarExtra("ScannerMainItem", systemImage: "rectangle.stack", isInserted: $showInMenuBar) {
            Button(LocalizedStringKey("OPEN_MAIN_WINDOW")) {
                self.openWindow(id: "MainWindow")
            }.keyboardShortcut("m")
            
            Divider()
            
            Button(LocalizedStringKey("QUIT")) {
                NSApplication.shared.terminate(nil)
            }.keyboardShortcut("q")
        }
    }
}

如果主窗口已经关闭,这可以正常工作。但是,如果主窗口仍然打开,另一个(新)示例将被打开。我如何在任何时候都只能打开一个ID为“Main”的窗口?

wnavrhmk

wnavrhmk1#

我已经为同样的问题挣扎了几个小时,并想出了一个解决方案。可能有更好的方法来解决这个问题,但现在我很高兴我有一些工作。

Button(LocalizedStringKey("OPEN_MAIN_WINDOW")) {
  openApp(id: "MainWindow")
}.keyboardShortcut("m")

..

func openApp(id: String) {
  NSApp.activate(ignoringOtherApps: true)
  let windowCount = NSWindow.windowNumbers()?.count
  if let windowCount {
    if windowCount <= 2 {
      openWindow(id: id)
    }
  }
}
tcomlyy6

tcomlyy62#

基于@o.hennig的回答,我稍微调整了一下代码:

func openApp(id: String) {
  NSApp.activate(ignoringOtherApps: true)
        
  if !NSApplication.shared.windows.contains(where: { $0.toolbar.hasValue })
  {
    self.openWindow(id: id)
  }
}

只是一个变通办法,但我的窗口是唯一的窗口与工具栏。。

相关问题