SwiftUI PreviewProvider usando CoreData para mostrar específicos NSManagedObject Entrada

0

Pergunta

[Xcode 12.4, Catalina 10.15.6, MacOS Projeto usando SwiftUI e CoreData]

Eu estou trabalhando em um aplicativo para apresentar alguns dados que eu tenho. A lógica de negócios do aplicativo está funcionando bem, e agora eu virei a minha atenção para a INTERFACE do usuário. Em ordem para arrumar o UI, eu gostaria de obter o PreviewProvider de trabalho para cada modo de exibição. Eu gostaria de visualizações para exibir dados já tenho no CoreData armazenamento de dados.

Depois de muita frustração, eu finalmente consegui a visualização para compilar e apresentar, no entanto, eu não estou vendo nenhuma real de dados na pré-visualização. Parece que enquanto o NSManagedObjectContext está lá, a pré-visualização não tiver selecionado qualquer entrada para exibir.

Como posso selecionar, dizem que a 3ª entrada no meu arquivo de dados a ser apresentado na pré-visualização?

Abaixo está o meu código para o modo de exibição que inclui o PreviewProvider no final (como normal) com alguns comentários explicando-lhe a seguinte.

    
    
    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 é um CoreData entidade (com um par de mil entradas), cada um dos quais tem vários atributos que incluem id, namee path (o arquivo). CoreDataStack.context é uma referência para a estrutura mostrada abaixo.

Para obter uma estático NSManagedObjectContext, conforme exigido pelo PreviewProvider, eu adicionei a seguinte estrutura para o meu projeto, 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() { ... }
    }

Eu, por exemplo, como passar na entrada com domain.id == 3 para a visualização. Como posso fazer isso? (Agradecemos antecipadamente por sua atenção.)

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

Melhor resposta

0

Eu percebi que estava faltando na minha PreviewProvider estrutura:

  1. Eu necessários para realizar uma NSFetchrequest, a fim de obter os dados.
  2. Então, eu era capaz de entradas de acesso no arquivo de dados usando o índice da matriz.
    Observe que o índice é um CoreData representação interna, e se você quiser um item específico, use SQLite para procurar o arquivo de dados para encontrar o que deseja 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

Em outros idiomas

Esta página está em outros idiomas

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