SwiftUI中MenuBarExtra内Sheet点击致菜单栏应用消失问题求助
问题现象
使用.menuBarExtraStyle(.window)的MenuBarExtra组件时,弹出Sheet后点击Sheet内任意区域(包括按钮),会触发MenuBarExtra主窗口关闭,导致Sheet无法正常交互。该问题在macOS 14.6及15版本中已确认存在。
原因分析
MenuBarExtra的window样式窗口默认属于临时模态窗口,当Sheet获取焦点时,系统会判定主窗口失去交互需求,自动将其关闭。
解决方案
通过修改MenuBarExtra窗口的层级和集合行为属性,让主窗口保持活跃状态,避免因Sheet获取焦点而被关闭。可借助NSApplicationDelegateAdaptor实现窗口配置:
完整修复代码
import SwiftUI // 自定义AppDelegate配置MenuBarExtra窗口 class AppDelegate: NSObject, NSApplicationDelegate { func applicationDidFinishLaunching(_ notification: Notification) { // 定位MenuBarExtra对应的窗口 guard let menuBarWindow = NSApplication.shared.windows.first(where: { $0.styleMask.contains(.nonactivatingPanel) }) else { return } // 设置窗口为浮动层级,保持在上方 menuBarWindow.level = .floating // 配置窗口集合行为,允许与Sheet共存 menuBarWindow.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary] } } 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") { print("按钮点击有效,主窗口未关闭") } } .frame(minWidth: 200, minHeight: 200) } } } @main struct MenuBarTestApp: App { // 注入自定义AppDelegate @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate var body: some Scene { MenuBarExtra { ContentView() } label: { Image(systemName: "circle") } .menuBarExtraStyle(.window) } }
关键修改说明
- 窗口层级设置:将
menuBarWindow.level设为.floating,确保主窗口始终处于浮动状态,不会因Sheet弹出而失去焦点。 - 集合行为配置:
collectionBehavior设置为[.canJoinAllSpaces, .fullScreenAuxiliary],让窗口可在所有空间显示,同时在全屏模式下保持辅助窗口特性,避免被系统自动关闭。
验证效果
运行修改后的代码,点击Sheet内的按钮或任意区域,MenuBarExtra主窗口会保持打开状态,Sheet可正常完成交互操作。
内容的提问来源于stack exchange,提问作者malik
相关产品推荐
相关产品推荐

