SwiftUI PreviewProvider à l'aide de CoreData pour montrer spécifique NSManagedObject Entrée

0

La question

[Xcode 12.4, Catalina 10.15.6, MacOS Projet à l'aide de SwiftUI et CoreData]

Je suis en train de travailler sur une application pour l'affichage de certaines données que j'ai. La logique métier de l'application fonctionne très bien, et maintenant, j'ai tourné mon attention à l'INTERFACE utilisateur. Pour le rangement de l'INTERFACE utilisateur, je voudrais obtenir le PreviewProvider de travail pour chaque vue. J'aimerais aussi que les aperçus pour afficher les données que j'ai déjà dans le CoreData banque de données.

Après beaucoup de frustration, j'ai enfin réussi à obtenir l'aperçu de compiler et d'affichage, mais je ne vois pas de réelles données dans l'aperçu. Il apparaît que, si le NSManagedObjectContext est là, l'aperçu n'a pas choisi n'importe quelle entrée pour l'affichage.

Comment puis-je choisir, dire la 3ème entrée dans ma banque de données à afficher dans l'aperçu?

Ci-dessous mon code pour l'affichage, qui comprend la PreviewProvider à la fin (comme d'habitude) avec quelques commentaires expliquant la suite.

    
    
    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 est un CoreData entité (avec un couple de mille entrées), dont chacune possède plusieurs attributs qui comprennent id, nameet path (le fichier). CoreDataStack.context est une référence à la structure indiquée ci-dessous.

Afin d'obtenir une statique NSManagedObjectContext, tel que requis par la PreviewProvider, j'ai ajouté la structure suivante pour mon projet, comme par 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() { ... }
    }

Je voudrais, par exemple, à faire passer dans l'entrée avec domain.id == 3 dans l'aperçu. Comment puis-je faire cela? (Merci d'avance pour votre attention.)

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

La meilleure réponse

0

J'ai travaillé sur ce qui manquait dans ma PreviewProvider struct:

  1. J'ai besoin d'effectuer une NSFetchrequest afin d'obtenir les données.
  2. Ensuite, j'ai été en mesure d'accéder à des entrées dans la banque de données à l'aide de l'index de tableau.
    Notez que l'index est un CoreData représentation interne, et si vous voulez un élément spécifique, l'utilisation SQLite pour parcourir la banque de données pour trouver celle que vous voulez voir.
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

Dans d'autres langues

Cette page est dans d'autres langues

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