You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI中MenuBarExtra内Sheet点击致菜单栏应用消失问题求助

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:54:55