我想做类似以下的工作:
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
混合。
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
,它可以多次打开同一个窗口。