SwiftUI PreviewProvider wykorzystuje CoreData do wyświetlania konkretnego zapisu NSManagedObject

0

Pytanie

[Xcode 12.4, Catalina 10.15.6, projekt macOS z wykorzystaniem SwiftUI i CoreData]

Pracuję nad aplikacją do wyświetlania niektórych dostępnych u mnie danych. Logika biznesowa aplikacji działa normalnie, a teraz zwróciłem uwagę na interfejs użytkownika. Do tego, aby doprowadzić do porządku interfejs użytkownika, chciałbym uzyskać PreviewProvider działa dla każdego gatunku. Chciałbym również, aby wstępne przeglądy zawierały dane, które już mam w repozytorium danych CoreData.

Po wielu rozczarowań mi w końcu udało się skompilować i wyświetlić podgląd, jednak nie widzę żadnych rzeczywistych danych w podglądzie. Wygląda na to, że choć NSManagedObjectContext obecny, podgląd nie wybrał żadnych wpisów do wyświetlenia.

Jak mogę wybrać, powiedzmy, 3. wpis w moim repozytorium danych, która będzie wyświetlana w podglądzie?

Oto mój kod do prezentacji, która zawiera PreviewProvider w końcu (jak zwykle) z niektórymi komentarzami, объясняющими to poniżej.

    
    
    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 jest istotą CoreData (z kilku tysięcy rekordów), z których każda ma kilka cech, które obejmują id, namei path (w pliku). CoreDataStack.context to jest link na strukturę pokazaną poniżej.

Aby uzyskać statyczny NSManagedObjectContext, jak wymaga tego dostawca podglądu, dodałem swój projekt następującą strukturę zgodnie z 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() { ... }
    }

Ja bym na przykład chciał przekazać nagranie z domain.id == 3 w podglądzie. Jak mogę to zrobić? (Z góry dziękuję za uwagę.)

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

Najlepsza odpowiedź

0

Dowiedziałem się, czego brakowało w moim PreviewProvider struktura:

  1. Musiałem wykonać zapytanie Nsfetch, aby uzyskać dane.
  2. Następnie udało mi się uzyskać dostęp do danych w magazynie danych, za pomocą indeksu tablicy.
    Należy zwrócić uwagę, że indeks jest wewnętrzną reprezentacją CoreData, i jeśli potrzebny jest konkretny element, użyj SQLite aby zobaczyć repozytorium danych i znaleźć to, co chcesz zobaczyć.
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

W innych językach

Ta strona jest w innych językach

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