SwiftUI vista previa de los accidentes con los Datos principales de los 'NSInvalidArgumentException'

0

Pregunta

Tengo el problema de que no puedo vista previa de la Vista de mis app con Lona, porque siempre me sale el error:

"La terminación de la aplicación debido a una excepción no capturada 'NSInvalidArgumentException', la razón: "Un NSManagedObject de clase 'App.MPG_A' deben tener una validez de NSEntityDescription."

Ahora más detallada: En el punto de vista que desea obtener una vista previa tengo un @de Unión de la clase abstracta MultiplayerGame (MPG UNA o MPG B (subclases) y el MultiplayerGame es una subclase de Juego (imagen de abajo)

App Model

Comentario: MultiplayerGame es también una entidad abstracta (como el Juego) y "de Clase" -> "MPG B"

Y cuando me desea obtener una vista previa de la clase de la siguiente clase por hacer un moc Objeto en la vista previa de mi Aplicación se bloquea, pero no sé por qué:

    import SwiftUI
import CoreData
import Combine

struct StandingEditView: View {
    
    //multiplayer game with MPG A or MPG B class
    @Binding var game : MultiplayerGame
    
    @State private var invokeFunction : Bool = false
    
    var body: some View {
        
        VStack{
            
            List{
                
                ForEach(game.players!, id: \.self){ player in
                    
                    HStack{
                        Text("\(player.name)")
                    }
                    
                }
                
            }
            
            Button(action: {
                invokeFunction.toggle()
            }, label: {
                Text("Button")
            })
            
        }
        
    }
}

struct StandingEditView_Previews: PreviewProvider {
    
    static let moc = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    
    static var previews: some View {
        
        let game : MultiplayerGame = Standing(context: moc)
        
        let p1 : Player = Player(context: moc)
        let p2 : Player = Player(context: moc)
        let p3 : Player = Player(context: moc)
        
        p1.name =  "Player One"
        p2.name =  "Player Two"
        p3.name =  "Player Three"
        
        game.players = [p1,p2,p3]
        
        return StandingEditView(game: .constant(game))
    }
}

Y la única (no por defecto) los atributos de Jugador es -> var nombre : String

También probé con AppDelegate pero que no funciona tampoco...

El error debe ocurrir a causa de la vista previa y moc-Objeto porque el propio Código se compila y las otras Vistas son visibles sin un error.

Gracias por su ayuda!

core-data preview swift swiftui
2021-11-24 01:22:48
2
0

Usted necesitará la instalación de una pila para su contexto. El NSManagedObjectContext debe ser consciente de su modelo.

El siguiente StackBuilder la clase ofrece un temporary versión adecuada para las previsualizaciones.

private final class StackBuilder {
    
    private let modelName = "Model" // must match your model filename
    
    public enum Configuration {
        case temporary
        case permanent
    }
    
    let configuration: Configuration
    
    public init(_ configuration: Configuration = .permanent) {
        self.configuration = configuration
    }
    
    public func load() throws -> NSPersistentContainer {
        var errors = [Error]()
        let persistentContainer = NSPersistentContainer(name: modelName)
        persistentContainer.persistentStoreDescriptions = [description(for: configuration)]
        persistentContainer.loadPersistentStores { (value, error) in
            if error != nil {
                errors.append(error!)
            }
        }
        if errors.count > 0 {
            throw errors.first!
        }
        return persistentContainer as NSPersistentContainer
    }
    
    private func description(for configuration: Configuration) -> NSPersistentStoreDescription {
        let desc = NSPersistentStoreDescription(url: NSPersistentContainer.defaultDirectoryURL())
        switch configuration {
        case .temporary:
            desc.type = NSInMemoryStoreType
        case .permanent:
            desc.shouldInferMappingModelAutomatically = true
            desc.shouldMigrateStoreAutomatically = true
            desc.type = NSSQLiteStoreType
        }
        return desc
    }
}

Puede ser necesario pasar a lo largo de el contexto como un objeto del entorno.

static var previews: some View {
    return StandingEditView(game: .constant(game))
            .environment(\.managedObjectContext, moc)
}
2021-11-24 06:05:30

Tengo que llamar a la StackBuilder clase en cualquier lugar? El mismo error "NSInvalidArgumentException" aparece - pero el proyecto es construir correctamente y las otras Vistas son visibles
ProgrammingAverage

y qué tengo que hacer que sólo el nombre del modelo como "MPG" a " o también "MPG A+CoreDataClass" y la Propiedad?
ProgrammingAverage

Mejor respuesta

0

Ya he intentado todas las demás posibilidades y nada ha ayudado, he creado un proyecto nuevo y comprobado CoreData.

A continuación, he creado la clase principal en la CoreData archivo y reemplaza Item con Game en "ContentView".

También en el PersistenceController He sustituido el Item con Game en virtud de la var preview : PersistenceController y creó todas las clases con codegen "Manual/None".

Ahora todo funciona.

2021-11-29 07:01:36

En otros idiomas

Esta página está en otros idiomas

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