SwiftUI PreviewProvider pomocou CoreData ak chcete zobraziť konkrétne NSManagedObject Vstup

0

Otázka

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

Pracujem na aplikáciu na zobrazenie niektorých údajov, čo mám. Obchodnú logiku aplikácie je v poriadku, a teraz som sa obrátil svoju pozornosť na UI. V záujme tidy up UI, ktoré by som rád dostať na PreviewProvider práca pre každého pohľadu. Tiež by som rád náhľady ak chcete zobraziť údaje, ktoré som už v CoreData datastore.

Po veľa frustrácie, sa mi konečne podarilo získať náhľad na zostavenie a displeja, avšak nevidím žiadne skutočné údaje v okne s ukážkou. Zdá sa, že zatiaľ čo NSManagedObjectContext je tam, ukážky nebola vybraná žiadna položka na displeji.

Ako môžem si vybrať, povedať, 3. položky v mojom datastore byť zobrazené v okne s ukážkou?

Nižšie je moja kód pre zobrazenie, ktoré obsahuje PreviewProvider na konci (normálne) s niektorými komentármi vysvetľovať to takto.

    
    
    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íc záznamov), z ktorých každá má niekoľko atribútov, ktoré obsahujú id, namea path (súbor). CoreDataStack.context je odkaz na struct uvedené nižšie.

V snahe získať statické NSManagedObjectContext, ako je požadované podľa PreviewProvider, pridal som takto struct na môj projekt, podľa 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() { ... }
    }

Povedal by som, napríklad, ako prejsť vstup s domain.id == 3 do náhľadu. Ako môžem to urobiť? (Ďakujem vopred za vašu pozornosť.)

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

Najlepšiu odpoveď

0

Pracoval som sa na to, čo chýbalo v mojom PreviewProvider struct:

  1. Ja som potreboval vykonať NSFetchrequest s cieľom získať údaje.
  2. Potom, bol som schopný prístup záznamy v datastore pomocou index poľa.
    Upozorňujeme, že index je CoreData vnútornej reprezentácie, a ak chcete konkrétnu položku, použite SQLite ak chcete prehliadať datastore nájsť ten, ktorý chcete zobraziť.
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 iných jazykoch

Táto stránka je v iných jazykoch

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