SwiftUI PreviewProvider pomocí CoreData ukázat konkrétní NSManagedObject Vstup

0

Otázka

[Xcode 12.4, Catalina 10.15.6, MacOS Projektu pomocí SwiftUI a CoreData]

Já jsem pracoval na aplikace pro zobrazení některých dat, které mám. Obchodní logiky aplikace je v pořádku, a teď jsem se obrátil svou pozornost na uživatelské ROZHRANÍ. Za účelem uklidit UI, chtěl bych se dostat na PreviewProvider pracuje pro každé zobrazení. Také bych rád na náhledy pro zobrazení data už mám v CoreData datastore.

Po velké zklamání, jsem konečně podařilo získat náhled do kompilace a zobrazí, nicméně nevidím žádné skutečné údaje v náhledu. Zdá se, že zatímco NSManagedObjectContext je tam náhled není vybrán vstup, který chcete zobrazit.

Jak mohu vybrat, řekněme 3 vstup v mé datového úložiště se zobrazí v náhledu?

Níže je můj kód pro zobrazení, která obsahuje PreviewProvider na konci (jako normální), s některými komentáře vysvětlující je následující.

    
    
    import SwiftUI
    
    struct DomainRow: View {
      
      @Environment(\.managedObjectContext) var context
      @ObservedObject var domain : DomainFiles
      private var id : LocalizedStringKey {
        get {
          return LocalizedStringKey(String(Int(domain.id)))
        }
      }
      
      var body: some View {
        HStack (alignment: .center) {
          Text(id)
          Spacer()
          VStack(alignment: .leading) {
            Text(domain.name!)
              .fontWeight(.bold)
              .truncationMode(.tail)
              .frame(minWidth: 20)
    
            Text(domain.path!)
              .font(.caption)
              .opacity(0.625)
              .truncationMode(.middle)
          }
        }
        .padding(.vertical, 4)
      }
    }
    
    #if DEBUG
    struct DomainRow_Previews: PreviewProvider {
    
      @Environment(\.managedObjectContext) var managedObjectContext
    
      static var previews: some View {
        let context = CoreDataStack.context
        let domain = DomainFiles(context: context)
        return DomainRow(domain: domain)
          .environment(\.managedObjectContext, CoreDataStack.context)
      }
    }
    #endif

DomainFiles je CoreData subjekt (s pár tisíci záznamy), z nichž každý má několik atributů, které zahrnují id, namea path (do souboru). CoreDataStack.context je odkaz na struct je uvedeno níže.

S cílem získat statické NSManagedObjectContext, jak to vyžaduje PreviewProvider, jsem přidal následující struct do mého projektu, dle https://developer.apple.com/forums/thread/650269

    import Foundation
    import CoreData
    
    struct CoreDataStack {
        static var context: NSManagedObjectContext {
            return persistentContainer.viewContext
        }
      
        static let containerName: String = "MyAppsDataStore"
    
        static var persistentContainer: NSPersistentContainer = {
            let container = NSPersistentContainer(name: containerName)
            container.loadPersistentStores { (description, error) in
                if let error = error {
                    print(error)
                }
            }
            return container
        }()
    //    Don't need to save anything in the preview.
    //    func saveContext() { ... }
    }

Chtěl bych, například, jako projít v položce s domain.id == 3 do náhledu. Jak to mohu udělat? (Díky předem za vaši pozornost.)

core-data swiftui
2021-11-17 02:43:02
1

Nejlepší odpověď

0

Už vím, co mi chybí PreviewProvider struct:

  1. Potřeboval jsem provést NSFetchrequest s cílem získat údaje.
  2. Pak jsem byl schopen přístup záznamů v datastore pomocí indexu pole.
    Všimněte si, že index je CoreData vnitřní reprezentaci, a pokud chcete konkrétní položku, použijte SQLite procházet datastore najít ten, který chcete vidět.
struct EntriesView_Previews: PreviewProvider {

  @Environment(\.managedObjectContext) var managedObjectContext

  static var previews: some View {
    let context = CoreDataStack.context
    let domainFiles : [DomainFiles]
    let requestDomainFiles : NSFetchRequest<DomainFiles> = DomainFiles.fetchRequest()
    do {
      domainFiles = try context.fetch(requestDomainFiles)
    } catch {
      let nserror = error as NSError
      fatalError("Error \(nserror): \(nserror.userInfo)")   //  DO NOT DO THIS IN REAL CODE.  PROVIDE FALLBACK
    }
    let domain = domainFiles[0]
    return EntriesView(domain: domain)
      .environment(\.managedObjectContext, CoreDataStack.context)
  }
}
2021-11-17 05:01:43

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................