SwiftUI Anteprima si blocca con i Dati principali di 'NSInvalidArgumentException'

0

Domanda

Ho il problema che non riesco a visualizzare in anteprima la Vista delle mie app con la Tela, perché ricevo sempre il messaggio di errore:

"Terminazione app a causa di uncaught exception 'NSInvalidArgumentException', motivo: 'Un NSManagedObject di classe 'App.MPG_A' necessario disporre di un valido NSEntityDescription."

Ora più dettagliate: In vista voglio anteprima ho un @Vincolante della classe astratta MultiplayerGame (MPG o MPG B (sottoclassi) e il MultiplayerGame è una sottoclasse di Gioco (foto sotto)

App Model

Commento: MultiplayerGame è anche un'entità astratta (come il Gioco) e di "Classe" -> "MPG B"

E quando voglio visualizzare in anteprima la classe la seguente classe, facendo moc Oggetto in Anteprima la mia App si blocca, ma non so perché:

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

E il solo (non di default) attributi del Giocatore è -> var nome : String

Ho provato anche con AppDelegate, ma che non ha funzionato neanche...

L'errore deve verificarsi a causa di Anteprima e moc-Oggetto, in quanto il Codice viene compilato e l'altro Vista sono visibili senza un errore.

Grazie per il vostro aiuto!

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

Sarà necessario impostare una pila per il contesto. Il NSManagedObjectContext deve essere consapevole del proprio modello.

Il seguente StackBuilder classe offre un temporary versione adatta per le anteprime.

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

Potrebbe essere necessario passare lungo il contesto di un ambiente in oggetto.

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

Devo chiamare il StackBuilder classe da nessuna parte? Lo stesso errore "NSInvalidArgumentException" appare - ma il progetto è costruire correttamente e le altre Viste sono visibili
ProgrammingAverage

e devo farlo solo per il nome del modello come "MPG" o anche "MPG A+CoreDataClass" e la Proprietà?
ProgrammingAverage

Migliore risposta

0

Dal momento che ho provato tutte le altre possibilità e nulla ha aiutato, ho creato un nuovo progetto e controllato CoreData.

Poi ho creato la classe principale nel CoreData file e sostituito Item con Game in "ContentView".

Anche in PersistenceController Ho sostituito il Item con Game sotto il var preview : PersistenceController e ha creato tutte le classi con il codegen "Manual/None".

Ora tutto funziona.

2021-11-29 07:01:36

In altre lingue

Questa pagina è in altre lingue

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