SwiftUI Previzualizare accidente cu Bază de Date NSInvalidArgumentException'

0

Problema

Eu am problema ca nu pot previzualiza Vedere al meu app cu Panza, pentru că eu mereu primesc eroarea:

"De încheiere aplicație din cauza excepție neprins 'NSInvalidArgumentException', motiv: Un NSManagedObject de clasa App.MPG_A' trebuie să aibă o adresă validă de NSEntityDescription."

Acum mai detaliată: În opinia vreau să examinați am o @Obligatorii de clasă abstractă MultiplayerGame (MPG sau MPG B (subclase) și MultiplayerGame este o subclasă de Joc (imaginea de mai jos)

App Model

Comentariu: MultiplayerGame este, de asemenea, o entitate abstractă (ca Joc) și "Clasa" -> "MPG B"

Și când vreau să examinați clasa următoarea clasă de a face un moc Obiect în Previzualizare App meu accidente, dar nu știu de ce:

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

Și numai (nu implicit) atributele de Jucător este -> var nume : String

Am încercat, de asemenea, cu AppDelegate dar nu merge nici cu asta...

Eroarea trebuie să aibă loc pentru că de Previzualizare și moc-Obiect deoarece Codul în sine compilează și alte puncte de Vedere sunt vizibile fără o eroare.

Vă mulțumesc pentru ajutor!

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

Veți avea nevoie pentru a seta un teanc de context. La NSManagedObjectContext trebuie să fie conștienți de modelul dumneavoastră.

Următoarele StackBuilder clasa oferă o temporary versiune potrivit pentru previzualizări.

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

Ar putea fi necesar pentru a trece de-a lungul context ca un mediu de obiect.

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

Trebuie să sun la StackBuilder clasa de oriunde? Aceeasi eroare "NSInvalidArgumentException" apare - dar proiectului este de a construi în mod corect și la alte puncte de Vedere sunt vizibile
ProgrammingAverage

și trebuie să fac asta doar pentru modelul nume ca "MPG-O" sau "MPG O+CoreDataClass" și de Proprietate?
ProgrammingAverage

Cel mai bun răspuns

0

Din moment ce am încercat toate posibilitățile și nimic nu a ajutat, am creat un nou proiect și verificate CoreData.

Apoi am creat clasa principală în CoreData fișier și înlocuit Item cu Game în "ContentView".

De asemenea, în PersistenceController Am înlocuit Item cu Game sub var preview : PersistenceController și a creat toate clasele cu codegen "Manual/None".

Acum totul funcționează.

2021-11-29 07:01:36

În alte limbi

Această pagină este în alte limbi

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