如何通过菜单栏中的按钮向我的应用程序添加窗口?

问题描述 投票:0回答:1

我想做类似以下的工作:

import SwiftUI

@main
struct TestWindowApp: App {
  init() {
    _showWindow = .constant(false)
  }

  var body: some Scene {

    MenuBarExtra {
      Button("Show window") { showWindow = true }
    } label: {
      Text(">_<")
    }

    if showWindow {
      Window("window", id: "main") {
        Text("Hello, SwiftUI!")
          .padding()
      }
    }
  }

  @Binding
  var showWindow: Bool
}

这无法编译。

我尝试使用

WindowGroup
而不是
Window
,如果条件在
WindowGroup
中,则可以编译。我首先发现当
WindowGroup
存在时
MenuBarExtra
工作不可靠,当
showWindow
条件不满足时,它会显示一个空窗口:

WindowGroup {
  if showWindow {
    Text("Hello, SwiftUI!")
      .padding()
  }
}

我非常有信心,当

NSWindow
为 true 时,我可以通过创建
showWindow
来获得所需的行为,但我不希望将
AppKit
SwiftUI
混合。

macos swiftui
1个回答
0
投票

使用

openWindow
环境值打开窗口。您不应该用
if
围住窗户。

@Environment(\.openWindow) var openWindow

var body: some Scene {
    MenuBarExtra {
        Button("Show window") { openWindow(id: "main") }
    } label: {
        Text(">_<")
    }
    Window("window", id: "main") {
        Text("Hello, SwiftUI!")
            .padding()
    }
}

通过写入

MenuBarExtra
first,窗口将不会最初打开。

Window
只是一个窗口。再次单击菜单按钮将不会打开第二个窗口。如果您想要这种行为,请使用
WindowGroup
,它可以多次打开同一个窗口。

© www.soinside.com 2019 - 2024. All rights reserved.