Ich dupliziere eine vorhandene Objective-C-TV-Show-App mit Xcode 6.1 auf eine neue Swift-Version und habe einige Probleme mit CoreData.
Ich habe ein Modell von 4 Entitäten erstellt, ihre NSManagedObject-Unterklasse (in Swift) erstellt und für alle Dateien sind die richtigen App-Ziele festgelegt (für 'Quellen kompilieren').
Ich erhalte immer noch diesen Fehler, wenn ich versuche, eine neue Entität einzufügen:
CoreData: Warnung: Klasse mit dem Namen 'Shows' für Entität 'Shows' kann nicht geladen werden. Klasse nicht gefunden, stattdessen Standard-NSManagedObject.
Ein paar Kommentare:
Beim Speichern in Kerndaten verwende ich die Eltern-Kind-Kontextmethode, um Hintergrund-Threading zuzulassen. Dazu richte ich den ManagedObjectContext ein mit:
lazy var managedObjectContext: NSManagedObjectContext? = {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
let coordinator = self.persistentStoreCoordinator
if coordinator == nil {
return nil
}
var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
und durch Speichern von Daten mit:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in
var context = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)
context.parentContext = self.managedObjectContext!
...rest of core data saving code here...
})
quelle
@objc(MyClass)
Aber für diejenigen, die
@objc(myEntity)
in Swift arbeiten (wie ich), können Sie stattdessen diese andere Lösung verwenden, die reibungslos funktioniert.In der xcdatamodel richtigen Klasse in. Es sollte so aussehen:
Bitte schön.
Module.Class
ist das Muster für CoreData in Swift und XCode 6. Sie benötigen das gleiche Verfahren auch, wenn Sie die Klasse " Benutzerdefinierte Richtlinien" in Modellrichtlinien oder anderen CoreData-Elementen verwenden. Ein Hinweis: Im Bild sollten Name und Klasse Car und MyAppName.Car sein (oder wie auch immer der Name Ihrer Entität lautet). HierUser
ist ein Tippfehler.quelle
Car
für beide Felder hat es den Trick gemacht.Bei Verwendung von Xcode 7 und rein Swift musste ich tatsächlich aus meiner automatisch generierten Unterklasse (generiert aus > ) entfernen .
@objc(MyClass)
NSManagedObject
EditorCreate NSManagedObject Subclass...quelle
In Xcode 7 Beta 2 (und ich glaube 1) wird in der Modellkonfiguration ein neues verwaltetes Objekt vom Typ
File
auf das Modul gesetztCurrent Product Module
und die Klasse des Objekts in der Konfiguration als angezeigt.File
.Das Löschen der Moduleinstellung, damit sie leer ist, oder das Entfernen des Punkts, damit der Klassenname in der Konfiguration nur
File
äquivalente Aktionen sind, da jede die andere Änderung verursacht. Durch Speichern dieser Konfiguration wird der beschriebene Fehler behoben.quelle
In Xcode 6.1.1 müssen Sie das Attribut @objc nicht hinzufügen, da die Basisentität eine Teilmenge einer objc-Klasse (NSManagedObject) ist (siehe Swift- Typkompatibilität. In CoreData ist der vollständige Name der Module.Class erforderlich. Beachten Sie das Modul Der Name wird unter Build-Einstellungen -> Verpackung -> Name des Produktmoduls festgelegt. Standardmäßig ist dies auf $ (PRODUCT_NAME: c99extidentifier) festgelegt, der der Name des Ziels ist .
quelle
my-product
inmy_product
, und das machte den Unterschied zu Core Data.Mit xCode 7 und Swift 2.0 müssen Sie @objc (NameOfClass) nicht hinzufügen. Ändern Sie einfach die Entitätseinstellungen auf der Registerkarte "Show the Data Model Inspector" wie unten -
Name - "Name Ihrer Entität"
Klasse - "Ihr Entitätsname"
Modul - "Aktuelles Produktmodul"
Der Code für die Entitätsklassendatei lautet wie folgt (in meinem Code Entität ist Familie) -
Dieses Beispiel funktioniert in meiner App mit xCode 7.0 + swift 2.0 einwandfrei
quelle
Vergessen Sie nicht, durch
PRODUCT_MODULE_NAME
den Namen Ihres Produktmoduls zu ersetzen .Wenn eine neue Entität erstellt wird, müssen Sie den Datenmodellinspektor (letzte Registerkarte) aufrufen und durch
PRODUCT_MODULE_NAME
Ihren Modulnamen ersetzen.class not found
Andernfalls tritt beim Erstellen des persistenten Geschäftskoordinators ein Fehler auf.quelle
Sie müssen auch (zumindest mit Xcode 6.3.2) Module.Class verwenden, wenn Sie Ihre Besetzung durchführen, zum Beispiel: Angenommen, Ihr Modul (dh Produktname) ist Food und Ihre Klasse ist Fruit
Rekapitulieren:
quelle
Ich bin auch auf ein ähnliches Problem gestoßen. Befolgen Sie diese Schritte, um Folgendes zu beheben:
quelle
Das Ändern des Namens der Entitätsklasse im Datenmodell-Editor, um der betreffenden Klasse zu entsprechen, und das Hinzufügen
@objc(NameOfClass)
zur Datei jedes NSManagedObject direkt über der Klassendeklaration löste dieses Problem für mich während des Komponententests.quelle
Was für mich funktioniert hat (Xcode 7.4, Swift), ist die Änderung des Klassennamens in
<my actual class name>.<entity name>
im Feld "Klasse" des Entitätsinspektors geändert.Mein Initiator der Unterklasse "Verwaltetes Objekt" sieht folgendermaßen aus:
quelle
Für Xcode 11.5: Wenn die Codegen-Eigenschaft die Klassendefinition ist und Sie keinen Vorschlag für die Entität erhalten, die Sie in xcdatamodel erstellt haben. Versuchen Sie, Xcode zu beenden und Ihr Projekt erneut zu öffnen. Für mich geht das. Diese Antwort ist nur, wenn Sie keine Vorschläge erhalten, aber wenn Ihre Datei nicht generiert wird, versuchen Sie eine der obigen Antworten.
quelle