簡體   English   中英

我的 SwiftUI FetchRequest 雖然有 10 個項目但沒有顯示任何項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM