我正在尝试在 SwiftUI 中的
Sheet
中打开 MenuBarExtra
。我不知道为什么会发生这种情况,但在 Sheet
内部单击会消除 MenuBarExtra
,因此基本上无法使用。
我做了这个最小的例子来展示这个问题:
import SwiftUI
struct ContentView: View {
@State var sheetDisplayed: Bool = true
var body: some View {
Text("test")
.padding()
.frame(minWidth: 500, minHeight: 500)
.sheet(isPresented: $sheetDisplayed) {
VStack {
Text("test2")
Button("click me") {}
}
.frame(minWidth: 200, minHeight: 200)
}
}
}
@main
struct MenuBarTestApp: App {
var body: some Scene {
MenuBarExtra {
ContentView()
} label: {
Image(systemName: "circle")
}.menuBarExtraStyle(.window)
}
}
单击“单击我”按钮或
Sheet
内的任意位置将关闭菜单栏应用程序。我已经确认在 macOS 14.6 和 15 上都会发生这种情况。
我在 macOS 13.6.8、Xcode 15.2 上使用新项目中的示例代码进行了测试:
因此,您所看到的行为实际上可能是您尝试的版本中的框架错误。
dismiss
方法实际上会关闭菜单栏窗口,而不将绑定设置为 false sheetDisplayed
(不是预期的),而设置绑定直接关闭工作表而不是窗口(预期)。
虽然这不是一个完整的解决方案,但它可能会澄清您问题的一部分。
这是我的测试应用程序:
import SwiftUI
struct ContentView: View {
@State private var sheetDisplayed: Bool = false
@Environment(\.dismiss) private var dismiss
var body: some View {
Text("Menu Bar Window")
.padding()
Button("Present Sheet") {
sheetDisplayed = true
}
.padding()
.frame(minWidth: 500, minHeight: 500)
.sheet(isPresented: $sheetDisplayed) {
VStack {
Text("Sheet")
Button("Falsify") {
sheetDisplayed = false // <- This works as expected!
}
Button("Dismiss") {
dismiss() // <- `dismiss` will close the menu bar window.
}
}
.frame(minWidth: 200, minHeight: 200)
}
.task(id: sheetDisplayed) {
print("sheetDisplayed: \(sheetDisplayed)") // will not print false with `dismiss`!
}
}
}