如何在 SwiftUI 中的 WindowGroup 和 MenuBarExtra 之间共享同一个模型容器?

问题描述 投票:0回答:1

我正在开发一个 SwiftUI 应用程序,我需要在 WindowGroup 和 MenuBarExtra 之间共享相同的模型容器。目标是让两个组件同步更新,而无需重新启动应用程序。

import SwiftData

@main
struct DeployApp: App {
    @AppStorage("folderPaths") var folderPaths: [String]?
    @Environment(\.modelContext) private var modelContext
    
    var body: some Scene {
        WindowGroup(id: "settings-window") {
            ContentView()
        }
        .modelContainer(for: Project.self)
        
        MenuBarExtra {
            MenuView()
                .modelContainer(for: Project.self)
        } label: {
            Image(systemName: "swift")
        }
        .menuBarExtraStyle(.menu)
    }
}

问题:

我面临的问题是,关闭并重新打开应用程序后,更新仅发生在菜单栏中(反之亦然)。我希望 WindowGroup 和 MenuBarExtra 立即反映更改并保持同步。

预期结果:

WindowGroup 和 MenuBarExtra 都应使用相同的模型容器并实时更新其视图,而无需重新启动应用程序。

实际结果:

目前,模型中的更新仅在关闭并重新打开应用程序后反映在 WindowGroup 或 MenuBarExtra 中。

错误信息:

没有明确的错误消息,但 UI 组件的行为中存在明显的同步问题。

我尝试过的:

确保WindowGroup和MenuBarExtra都使用.modelContainer(for:Project.self)。 网上搜索了不同场景之间SwiftUI模型容器共享相关的解决方案。 尝试不同的方法来初始化和共享模型容器。 尽管做出了这些努力,问题仍然存在,并且我还没有找到允许 WindowGroup 和 MenuBarExtra 同步更新的解决方案。

研究:

我研究了有关 SwiftUI 和模型容器的各种资源,但大多数示例并未涵盖 WindowGroup 和 MenuBarExtra 之间共享模型容器的具体情况。

如何确保 WindowGroup 和 MenuBarExtra 使用相同的模型容器并正确更新而不需要重新启动应用程序?

swift macos swiftui swiftdata
1个回答
0
投票

感谢评论:“将容器放入他们都可以访问的变量中。Xcode 在新项目中提供的基本代码就是一个很好的例子。” – lorem ipsum

以下代码展示了如何初始化共享 ModelContainer 并在 WindowGroup 和 MenuBarExtra 中使用它:

import SwiftData

@main
struct DeployApp: App {
    let container: ModelContainer
    
    init() {
        do {
            container = try ModelContainer(for: Project.self)
        } catch {
            fatalError("Failed to initialize ModelContainer: \(error)")
        }
    }
    
    var body: some Scene {
        WindowGroup(id: "settings-window") {
            ContentView()
        }
        .modelContainer(container)
        
        MenuBarExtra {
            MenuView()
                .modelContainer(container)
        } label: {
            Image(systemName: "swift")
        }
        .menuBarExtraStyle(.menu)
    }
}

这可确保 WindowGroup 和 MenuBarExtra 使用相同的 ModelContainer 实例,从而使它们保持同步。

© www.soinside.com 2019 - 2024. All rights reserved.