macOS SwiftUI:独立WindowGroup能否共享DocumentGroup的ModelContext?
实现独立窗口共享DocumentGroup的ModelContext
当然可行,你可以通过在打开窗口时显式传递ModelContext的方式实现,核心思路是从持有上下文的EditorView将当前文档的ModelContext传递给新打开的工具窗口——因为DocumentGroup的ModelContext是和当前编辑的文档实例绑定的,每个文档都有独立的上下文,无法在App层面直接全局获取。
修改步骤:
- 调整工具窗口的打开逻辑
在EditorView中调用openWindow时,通过environment将当前的modelContext注入到新窗口的视图环境中:
struct EditorView: View { @Environment(\.modelContext) private var modelContext @Environment(\.openWindow) private var openWindow var body: some View { Button("Open Tools") { openWindow(id: "ToolsWindow") { ToolsView() .environment(\.modelContext, modelContext) } } } }
- 保持ToolsView的环境注入逻辑不变
你的ToolsView原本通过@Environment(\.modelContext)获取上下文,现在因为打开时已经注入了正确的环境,所以不需要修改:
struct ToolsView: View { @Environment(\.modelContext) private var modelContext var body: some View { Text("Tools") // 这里可以直接使用modelContext操作当前文档的数据 } }
原理说明
DocumentGroup会为每个打开的文档创建独立的ModelContext,并自动注入到其编辑器视图的环境中。通过在打开工具窗口时显式传递这个上下文,就能保证工具窗口和当前编辑的文档共享同一个数据上下文,所有数据操作都会同步到当前文档中。
内容的提问来源于stack exchange,提问作者Stitch
相关产品推荐
相关产品推荐

