SwiftUI Aperçu des accidents avec Base de Données 'NSInvalidArgumentException'

0

La question

J'ai le problème que je ne peux pas aperçu de la Vue de mon appli avec de la Toile, car je reçois toujours le message d'erreur:

"La résiliation d'application en raison de uncaught exception 'NSInvalidArgumentException', la raison: "Une NSManagedObject de classe 'App.MPG_A " doit avoir une validité NSEntityDescription."

Maintenant plus détaillée: Dans la vue, je veux aperçu j'ai un @de Liaison de la classe abstraite MultiplayerGame (MPG UN ou MPG B (sous-classes) et le MultiplayerGame est une sous-classe de Jeu (photo ci-dessous)

App Model

Commentaire: MultiplayerGame est également une entité abstraite (comme le Jeu) et "Classe" -> "MPG B"

Et quand je veux pour un aperçu de la classe la classe suivante en faisant un moc de l'Objet dans la fenêtre d'Aperçu de mon Application se bloque mais je ne sais pas pourquoi:

    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))
    }
}

Et la seule (pas par défaut) les attributs de Joueur est -> var nom : String

J'ai aussi essayé avec AppDelegate mais cela ne fonctionne pas non plus...

L'erreur doit se produire en raison de la Prévisualisation et le moc-Objet parce que le Code compile et les autres Vues sont visibles sans une erreur.

Merci pour votre aide!

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

Vous aurez besoin de configurer une pile pour votre contexte. L' NSManagedObjectContext devez être conscient de votre modèle.

La suite StackBuilder classe offre une temporary version adaptée pour les prévisualisations.

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
    }
}

Il peut être nécessaire de passer le long du contexte comme un objet de l'environnement.

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

Dois-je appeler le StackBuilder classe n'importe où? Le même message d'erreur "NSInvalidArgumentException" apparaît - mais le projet est de construire correctement et les autres Vues sont visibles
ProgrammingAverage

et dois-je le faire uniquement pour le modèle de nom comme "MPG UN" ou aussi "MPG A+CoreDataClass" et de la Propriété?
ProgrammingAverage

La meilleure réponse

0

Depuis que j'ai essayé toutes les autres possibilités et rien n'a aidé, j'ai créé un nouveau projet et vérifié CoreData.

Puis j'ai créé la classe principale dans le CoreData fichier et remplacé Item avec Game dans "ContentView".

Également dans le PersistenceController J'ai remplacé le Item avec Game en vertu de la var preview : PersistenceController et créé de toutes les classes avec codegen "Manual/None".

Maintenant tout fonctionne.

2021-11-29 07:01:36

Dans d'autres langues

Cette page est dans d'autres langues

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