如何在macOS App中仅保留一个窗口(保留新建窗口菜单)
实现SwiftUI单窗口应用:保留「New Window」菜单但仅允许一个窗口实例
你提到的移除「New Window」菜单的方案仅隐藏了选项,无法满足「仅显示一个窗口且保留菜单」的需求。以下是针对你的两个问题的具体实现方案:
核心思路
用Window(而非默认的WindowGroup)定义带唯一标识的窗口,通过系统API检查窗口实例是否存在,从而控制是否新建窗口。
完整代码实现
import SwiftUI @main struct SingleWindowApp: App { @Environment(\.openWindow) var openWindow var body: some Scene { // 定义带唯一ID的单窗口 Window("主窗口", id: "main-window") { ContentView() } .commands { CommandGroup(replacing: .newItem) { Button("New Window") { // 检查是否已有目标窗口实例 let hasExistingWindow = NSApplication.shared.windows.contains { window in window.identifier?.rawValue == "main-window" } guard !hasExistingWindow else { // 若窗口已存在,将其前置激活 NSApplication.shared.windows.first { $0.identifier?.rawValue == "main-window" }?.makeKeyAndOrderFront(nil) return } // 无窗口实例时新建 openWindow(id: "main-window") } .keyboardShortcut("N", modifiers: .command) } } } }
关键细节说明
- 新建窗口:通过
@Environment(\.openWindow)配合窗口唯一ID"main-window"调用新建,Window类型保证同一ID只会创建一个实例(即使重复调用openWindow,系统也不会新建)。 - 判断窗口是否已显示:通过
NSApplication.shared.windows遍历当前应用的所有窗口,匹配我们设置的窗口ID,以此判断是否已有实例。如果存在,直接将窗口前置激活,避免重复创建。
内容的提问来源于stack exchange,提问作者c00000fd
相关产品推荐
相关产品推荐

