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
相关产品推荐
相关产品推荐

