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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:01:02