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

SwiftUI(macOS 13):如何配置WindowGroup实现多项目/多编辑器窗口

解决方案

要实现同一项目可打开多个窗口,关键是让每个窗口拥有唯一的实例标识,避免系统复用已有窗口。具体实现步骤如下:

1. 定义窗口唯一标识结构体

创建一个同时包含项目ID和窗口UUID的结构体,确保每个窗口实例都有独一无二的标识:

struct ProjectWindowInstance: Identifiable, Hashable {
    let id: UUID
    let projectId: Project.ID
}
  • 遵循Identifiable让系统能识别唯一窗口实例
  • 遵循Hashable确保系统能正确区分不同实例

2. 重新配置WindowGroup

将WindowGroup的泛型类型改为上述结构体,不再绑定单一的Project.ID:

WindowGroup(for: ProjectWindowInstance.self) { $windowInstance in
    ContentView(projectId: windowInstance.projectId)
}

这里无需指定id参数,系统会自动使用结构体的id属性来区分窗口。

3. 调用openWindow创建新窗口

每次打开窗口时,生成一个带新UUID的ProjectWindowInstance实例:

// 打开同一项目的新窗口
let newWindowInstance = ProjectWindowInstance(id: UUID(), projectId: targetProject.id)
openWindow(value: newWindowInstance)

这样即使是同一个项目,每次调用都会生成全新的窗口实例,系统不会复用已有窗口,而是创建新窗口。

原理说明

你之前的实现中,WindowGroup绑定的是Project.ID,系统会将相同的Project.ID视为同一个窗口实例,因此调用openWindow时只会前置已有窗口。而通过引入包含UUID的结构体,每个窗口实例都有唯一标识,系统会识别为新的窗口需求,从而创建独立窗口。

内容的提问来源于stack exchange,提问作者viedev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:25:33