SwiftUI PreviewProvider utilizando CoreData para mostrar específicos de NSManagedObject Entrada

0

Pregunta

[Xcode 12.4, Catalina 10.15.6, MacOS Proyecto con SwiftUI y CoreData]

Estoy trabajando en una aplicación para mostrar algunos datos que tengo. La lógica de negocio de la aplicación está trabajando muy bien, y ahora he vuelto mi atención a la interfaz de usuario. Con el fin de adecentar la interfaz de usuario, me gustaría obtener la PreviewProvider de trabajo para cada vista. También me gustaría que las vistas previas para mostrar los datos que ya tengo en el CoreData almacén de datos.

Después de tanta frustración, finalmente me las arreglé para obtener la vista previa para recopilar y mostrar, sin embargo, yo no estoy viendo ninguna de datos reales en la vista previa. Parece que mientras que la NSManagedObjectContext está allí, la vista previa no ha seleccionado ninguna entrada para mostrar.

¿Cómo puedo seleccionar, decir la 3ª entrada en mi almacén de datos se muestra en la vista previa?

A continuación es mi código para la vista que incluye el PreviewProvider al final (como de costumbre) con algunos comentarios que explican lo siguiente.

    
    
    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 es un CoreData entidad (con un par de miles de entradas), cada uno de los cuales tiene varios atributos que incluyen id, namey path (el archivo). CoreDataStack.context es una referencia a la estructura que se muestra a continuación.

Con el fin de obtener una estática NSManagedObjectContext, como es requerido por la PreviewProvider, he añadido la siguiente estructura para mi proyecto, como por 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() { ... }
    }

Yo, por ejemplo, como para pasar de la entrada con domain.id == 3 en la vista previa. ¿Cómo puedo hacer esto? (Gracias de antemano por su atención.)

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

Mejor respuesta

0

Me funcionó lo que faltaba en mi PreviewProvider estructura:

  1. Yo necesitaba para realizar un NSFetchrequest con el fin de obtener los datos.
  2. Entonces, yo era capaz de acceder a las entradas en el almacén de datos utilizando el índice de la matriz.
    Tenga en cuenta que el índice es un CoreData representación interna, y si desea que un elemento específico, el uso de SQLite para examinar el almacén de datos para encontrar el que usted desea ver.
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

En otros idiomas

Esta página está en otros idiomas

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