我正在开发一个 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 使用相同的模型容器并正确更新而不需要重新启动应用程序?
感谢评论:“将容器放入他们都可以访问的变量中。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 实例,从而使它们保持同步。