SwiftUI PreviewProvider utilizzando CoreData per mostrare NSManagedObject Voce

0

Domanda

[Xcode 12.4, Catalina 10.15.6, MacOS Progetto utilizzando SwiftUI e CoreData]

Sto lavorando su un'applicazione per la visualizzazione di alcuni dati che ho. La logica di business dell'applicazione sta lavorando bene, e ora ho rivolto la mia attenzione per l'interfaccia utente. Al fine di riordinare l'interfaccia utente, vorrei ottenere i PreviewProvider di lavoro per ogni vista. Vorrei, inoltre, le anteprime per visualizzare i dati che ho già in CoreData datastore.

Dopo tanta frustrazione, finalmente sono riuscito ad avere l'anteprima per la compilazione e la visualizzazione, tuttavia non riesco a vedere alcuna effettiva dati in anteprima. Sembra che, mentre il NSManagedObjectContext c'è, l'anteprima non ha selezionato una voce per visualizzare.

Come faccio a selezionare, a dire il 3 ° entrata nel mio archivio dati per essere visualizzati in anteprima?

Di seguito è il mio codice per la visualizzazione che include la PreviewProvider alla fine (come di consueto) con alcuni commenti che spiegano in seguito.

    
    
    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 è un CoreData entità (con un paio di migliaia di voci), ognuno dei quali ha diversi attributi che includono id, namee path (il file). CoreDataStack.context è un punto di riferimento per la struttura mostrato di seguito.

Al fine di ottenere una statico NSManagedObjectContext, come richiesto dal PreviewProvider, ho aggiunto la seguente struttura per il mio progetto, come per 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() { ... }
    }

Vorrei, per esempio, come passare la voce con domain.id == 3 in anteprima. Come posso fare questo? (Grazie in anticipo per la vostra attenzione.)

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

Migliore risposta

0

Ho lavorato fuori che cosa mancava nella mia PreviewProvider struct:

  1. Ho bisogno di eseguire un NSFetchrequest per ottenere i dati.
  2. Allora, sono stato in grado di accedere alle voci in archivio utilizzando l'indice dell'array.
    Si noti che l'indice è un CoreData rappresentazione interna, e se volete un elemento specifico, utilizzare SQLite per sfogliare l'archivio dati per trovare quello che si desidera vedere.
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

In altre lingue

Questa pagina è in altre lingue

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