[英]My SwiftUI FetchRequest display no items although there is 10 iteme
這是我在代碼中的內容:
struct ServicesView: View {
@FetchRequest(entity: Category.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Category.name, ascending: false)], animation: .easeIn) var results: FetchedResults<Category>
var body: some View {
List(results) { category in
VStack(alignment: .leading, spacing: 3, content: {
Text(category.name)
.font(.system(size: 12))
.foregroundColor(.white)
Text("x\(category.services.count)")
})
}
.overlay(
Text(results.isEmpty ? "Nothing here" : "")
)
.onAppear {
print("😋")
print(Category.numberOfEntities())
}
}
}
在控制台上顯示:
10
為什么名單上什么都沒有?
數量是怎么計算的?
extension NSManagedObjectContext {
static func defaultContext() -> NSManagedObjectContext {
CoreDataManager.shared.defaultContext!
}
}
protocol Fetchable {
associatedtype FetchableType: NSManagedObject = Self
static func numberOfEntities() -> Int
}
extension Fetchable where Self: NSManagedObject {
static var entityName: String {
entity().name ?? ""
}
static func numberOfEntities() -> Int {
let request = NSFetchRequest<FetchableType>(entityName: entityName)
let context = NSManagedObjectContext.defaultContext()
do {
return try context.count(for: request)
} catch let error as NSError {
print("❌ Core Data Count Error \(error), \(error.userInfo)")
return 0
}
}
}
我想問題就在這里,因為我沒有在任何地方分配@Environment's managedObjectContext
。 我應該怎么做?
@main
struct Watch_AppApp: App {
var body: some Scene {
WindowGroup {
TabView {
TimerView()
ContentView()
ServicesView() // how do i assign here managed object context?
Text("4th page")
}
.tabViewStyle(PageTabViewStyle())
.onAppear(perform: loadData) //load data, fetch categories from cloudkit and save to core data, is is fetched and saved
}
}
}
首先,您必須將ManagedObjectContext
添加到您試圖從中獲取數據的視圖中。
您可以像這樣將其添加到您的視圖中:
struct ServicesView: View {
// The context for your view
@Environment(\.managedObjectContext) var viewContext
@FetchRequest(entity: Category.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Category.name, ascending: false)], animation: .easeIn) var results: FetchedResults<Category>
var body: some View {
List(results) { category in
VStack(alignment: .leading, spacing: 3, content: {
Text(category.name)
.font(.system(size: 12))
.foregroundColor(.white)
Text("x\(category.services.count)")
})
}
.overlay(
Text(results.isEmpty ? "Nothing here" : "")
)
.onAppear {
print("😋")
print(Category.numberOfEntities())
}
}
}
要從入口視圖傳遞上下文,您必須從PersistenceController
獲取上下文,如下所示:
@main
struct Watch_AppApp: App {
var body: some Scene {
WindowGroup {
TabView {
TimerView()
ContentView()
ServicesView()
// Assign the context
.environment(\.managedObjectContext, PersistenceController.shared.container.context)
Text("4th page")
}
.tabViewStyle(PageTabViewStyle())
.onAppear(perform: loadData) //load data, fetch categories from cloudkit and save to core data, is is fetched and saved
}
}
}
您可以在此處找到 Core Data 的文檔: https://developer.apple.com/documentation/coredata
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.