在 MenuBarExtra 中打开工作表

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

我正在尝试在 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 上都会发生这种情况。

swift macos swiftui swiftui-sheet menubarextra
1个回答
0
投票

我在 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`!
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.