我正在創建一個 SwiftUI macOS 應用程式,其中包含將根據用戶資料創建的動態選單項串列:

這是我嘗試創建選單的方式:
@main
struct MacOSApp: App {
@AppStorage("tagFilter") private var tagFilter: String = ""
@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Tag.name, ascending: true)], animation: .default)
private var tags: FetchedResults<Tag>
var body: some Scene {
WindowGroup {
ContentView(menuBarActionsState: menuBarActionsState)
.environment(\.managedObjectContext, storageProvider.persistentContainer.viewContext)
}.commands {
CommandGroup(before: CommandGroupPlacement.toolbar) {
Picker("Filter by Tag", selection: $tagFilter) {
ForEach(tags, id: \.self) { tag in
Text(tag.name ?? "").tag(tag.id ?? "")
}
}
}
}
}
}
問題是,我沒有managedObjectContext在@main應用程式中,因為這是應用程式的起點。它被注入到 的環境中ContentView,但選單是在其之上創建的。
因為我沒有managedObjectContext,所以在運行時會發生以下錯誤:
Context in environment is not connected to a persistent store coordinator: <NSManagedObjectContext: 0x6000039a2700>
我們可以訪問managedObjectContext的@main應用水平?或者,我可以注入managedObjectContext我@FetchRequest莫名其妙,所以我可以用它在@main應用程式來建立選單?
uj5u.com熱心網友回復:
根據它們使用的變數,將您的視圖資料結構分解為盡可能小。這被稱為嚴格失效,應該可以解決問題。
@main
struct MacOSApp: App {
var body: some Scene {
WindowGroup {
ContentView(menuBarActionsState: menuBarActionsState)
.environment(\.managedObjectContext, storageProvider.persistentContainer.viewContext)
}.commands {
CommandGroup(before: CommandGroupPlacement.toolbar) {
TagsView()
}
.environment(\.managedObjectContext, storageProvider.persistentContainer.viewContext)
}
}
}
struct TagsView: View {
@AppStorage("tagFilter") private var tagFilter: String = ""
@FetchRequest(sortDescriptors: [NSSortDescriptor(keyPath: \Tag.name, ascending: true)], animation: .default)
private var tags: FetchedResults<Tag>
var body: some View {
Picker("Filter by Tag", selection: $tagFilter) {
ForEach(tags, id: \.self) { tag in
Text(tag.name ?? "").tag(tag.id ?? "")
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/407741.html
標籤:
