SwiftUI PreviewProvider folosind CoreData să arate specifice NSManagedObject Intrare

0

Problema

[Xcode 12.4, Catalina 10.15.6, MacOS Proiect folosind SwiftUI și CoreData]

Lucrez la o aplicație pentru a afișa unele date am. Logica de business a aplicației este de lucru bine, și acum mi-am îndreptat atenția asupra UI. În scopul de a pune în ordine UI, mi-ar place pentru a obține PreviewProvider de lucru pentru fiecare vizualizare. Am dori, de asemenea, avanpremiera pentru a afișa date deja am în CoreData datastore.

După multă frustrare, am reușit în cele din urmă pentru a obține o previzualizare a compila și de a afișa, totuși eu nu văd niciun fel de date reale în previzualizare. Se pare că, deși NSManagedObjectContext este acolo, previzualizare nu a selectat nici o intrare pentru a afișa.

Cum pot selecta, să zicem a 3-a intrare în datastore pentru a fi afișate în previzualizare?

Mai jos este codul meu de vedere, care include PreviewProvider la sfârșitul (normal), cu unele comentarii, explicând că în urma.

    
    
    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 este un CoreData entitate (cu câteva mii de intrări), fiecare dintre care are mai multe atribute care includ id, nameși path (la dosar). CoreDataStack.context este o referință la struct prezentat mai jos.

În scopul de a obține un statice NSManagedObjectContext, în conformitate cu PreviewProvider, am adăugat următoarele struct pentru proiectul meu, ca pe 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() { ... }
    }

Mi-ar fi, de exemplu, ca pentru a trece în rubrica cu domain.id == 3 în previzualizare. Cum pot face asta? (Vă mulțumim anticipat pentru atenția dumneavoastră.)

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

Cel mai bun răspuns

0

Am dat seama ce lipsea în PreviewProvider struct:

  1. Am nevoie pentru a efectua o NSFetchrequest în scopul de a obține date.
  2. Apoi, am fost în stare pentru a accesa intrările în datastore folosind array index.
    Rețineți că indicele este un CoreData reprezentare internă, și, dacă doriți un anumit element, utilizați SQLite pentru a naviga pe datastore pentru a găsi cea pe care doriți să vedeți.
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

În alte limbi

Această pagină este în alte limbi

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