Çekirdek Veri 'NSInvalidArgumentException'ile SwiftUİ Önizleme çöküyor

0

Soru

Uygulamamın Görünümünü Canvas ile önizleyemediğim için sorunum var, çünkü her zaman hatayı alıyorum:

"Yakalanmamış istisna nedeniyle uygulamayı sonlandırma 'NSInvalidArgumentException', nedeni: 'Bir NSManagedObject sınıfı 'App.MPG_A ' geçerli bir NSEntityDescription olmalıdır."

Şimdi daha ayrıntılı: Önizlemek istediğim görünümde soyut sınıf Multiplayergame'in (MPG A veya MPG B (alt sınıflar) bir @ Bağlaması var ve MultiplayerGame Oyunun bir alt sınıfı (aşağıdaki resim)

App Model

Yorum: MultiplayerGame aynı zamanda soyut bir varlıktır (Oyun gibi) ve "Sınıf" - > "MPG B"

Ve Önizlemede bir moc Nesnesi yaparak aşağıdaki sınıfı önizlemek istediğimde Uygulamam çöküyor ancak nedenini bilmiyorum:

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

Ve Player'ın tek (varsayılan değil) öznitelikleri - > > var name: String

Ayrıca AppDelegate ile denedim ama bu da işe yaramadı...

Kodun kendisini derler ve diğer Görünümler hatasız görünür olduğundan Önizleme ve moc Nesnesi nedeniyle hata oluşmalıdır.

Yardımın için teşekkürler!

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

Bağlamınız için bir yığın ayarlamanız gerekir. Bu NSManagedObjectContext modelinizin farkında olmalısınız.

Aşağıdaki StackBuilder a sınıfı teklifler temporary önizleme için uygun sürüm.

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

Bağlamı bir ortam nesnesi olarak iletmeniz gerekebilir.

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

Herhangi bir yerde StackBuilder sınıfını aramak zorunda mıyım? Aynı hata "NSInvalidArgumentException" görünür - ancak proje doğru şekilde oluşturulur ve diğer Görünümler görünür
ProgrammingAverage

ve bunu sadece "MPG A" veya "MPG A+CoreDataClass" ve Property gibi model adı için yapmak zorunda mıyım?
ProgrammingAverage

En iyi cevabı

0

Diğer tüm olasılıkları denediğimden ve hiçbir şey yardımcı olmadığından, yeni bir proje oluşturdum ve kontrol ettim CoreData.

Sonra ana sınıfı oluşturdum CoreData dosya ve değiştirildi Item ile Game içinde "ContentView".

Ayrıca içinde PersistenceController Değiştirdim Item ile Game altında var preview : PersistenceController ve tüm sınıfları codegen ile oluşturdu "Manual/None".

Şimdi her şey çalışıyor.

2021-11-29 07:01:36

Diğer dillerde

Bu sayfa diğer dillerde

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