Ich arbeite an der Entwicklung einer App mit Core Data. Als ich eine Instanz erstellt habe mit:
let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: appDelegate.managedObjectContext)
let user = User(entity: entity, insertIntoManagedObjectContext: appDelegate.managedObjectContext)
Ich habe eine Warnung im Protokoll erhalten:
CoreData: warning: Unable to load class named 'User' for entity 'User'. Class not found, using default NSManagedObject instead.
Wie könnte ich das beheben?
Und noch eine Frage: Wie kann ich eine Instanzmethode in der NSManagedObject-Unterklasse definieren?
Bearbeiten:
Ich habe die Klasse der Entität wie im folgenden Screenshot angegeben:
ios
core-data
swift
nsmanagedobject
MsrButterfly
quelle
quelle
Antworten:
Update für Xcode 7 (endgültig): Das Voranstellen des Modulnamens für die Klasse (wie in Xcode 6 und frühen Beta-Versionen von Xcode 7) ist nicht mehr erforderlich. Die Apple-Dokumentation zum Implementieren von Core Data Managed Object-Unterklassen wurde entsprechend aktualisiert.
Der Datenmodellinspektor verfügt jetzt über zwei Felder "Klasse" und "Modul" für eine Entität:
Wenn Sie eine Swift-Unterklasse für verwaltete Objekte für die Entität erstellen, wird das Feld "Modul" auf "Aktuelles Produktmodul" gesetzt. Mit dieser Einstellung funktioniert das Erstellen von Instanzen sowohl in der Hauptanwendung als auch in Komponententests. Die Unterklasse für verwaltete Objekte darf nicht mit markiert sein
@objc(classname)
(dies wurde unter https://stackoverflow.com/a/31288029/1187415 beobachtet ).Alternativ können Sie das Feld "Modul" leeren (es wird "Keine" angezeigt) und die Unterklassen für verwaltete Objekte mit markieren
@objc(classname)
(dies wurde unter https://stackoverflow.com/a/31287260/1187415 beobachtet ).Anmerkung: Diese Antwort wurde ursprünglich für Xcode 6 geschrieben. In Bezug auf dieses Problem gab es einige Änderungen in den verschiedenen Betaversionen von Xcode 7. Da es sich um eine akzeptierte Antwort mit vielen Upvotes und Links handelt, habe ich versucht, die Situation für die aktuelle Xcode 7-Endversion zusammenzufassen.
Ich habe sowohl meine eigenen "Nachforschungen" angestellt als auch alle Antworten auf diese und die ähnliche Frage gelesen. CoreData: Warnung: Klasse mit Namen kann nicht geladen werden . Die Zuschreibung geht also an alle, auch wenn ich sie nicht speziell aufführe!
Vorherige Antwort für Xcode 6 :
Wie unter Implementieren von Core Data Managed Object-Unterklassen dokumentiert , müssen Sie dem Namen der Entitätsklasse im Feld Klasse im Modellentitätsinspektor den Namen Ihres Moduls voranstellen, z. B. "MyFirstSwiftApp.User".
quelle
@objc(ClassName)
in Christers Antwort vorgeschlagene Methode ausprobieren .Nur als Randnotiz. Ich hatte das gleiche Problem. Und alles was ich tun musste war hinzuzufügen
@objc(ClassName)
in meine Klassendatei einzufügen.Beispiel:
Und das hat mein Problem gelöst.
quelle
Die akzeptierte Antwort auf diese Frage half mir, das gleiche Problem zu lösen, aber ich hatte eine Einschränkung, von der ich dachte, dass sie für andere hilfreich sein würde. Wenn Ihr Projektname (Modulname) ein Leerzeichen enthält, müssen Sie das Leerzeichen durch einen Unterstrich ersetzen. Beispielsweise:
Entität: MyEntity Klasse: My_App_Name.MyClass
quelle
Denken Sie daran, Ihr Modul zu entfernen :
quelle
Abhängig davon, ob Sie als App gegen Tests ausgeführt werden, kann das Problem darin bestehen, dass die App sucht
<appName>.<entityName>
und wenn sie als Test ausgeführt wird, wie sie aussieht<appName>Tests.<entityName>
. Die Lösung, die ich derzeit verwende (Xcode 6.1), besteht darin, die NICHT zu füllenClass
derzeit verwende Feld in der CoreData-Benutzeroberfläche und es stattdessen im Code auszuführen.Dieser Code erkennt, ob Sie als App vs Tests ausgeführt werden, verwendet den richtigen Modulnamen und aktualisiert das
managedObjectClassName
.quelle
Wenn Sie in Ihrem Projektnamen einen Bindestrich wie "My-App" verwenden, verwenden Sie anstelle des Bindestrichs wie "My_App.MyManagedObject" einen Unterstrich. Überprüfen Sie im Allgemeinen den Namen der xcdatamodeld-Datei und verwenden Sie dasselbe Präfix wie in diesem Namen. Dh "My_App_1.xcdatamodeld" erfordert das Präfix "My_App_1"
quelle
Dies kann denjenigen helfen, bei denen das gleiche Problem auftritt. Ich war mit Swift 2 und Xcode 7 Beta 2.
Die Lösung in meinem Fall war auszukommen
@objc(EntityName)
inEntityName.swift
.quelle
Ich hatte die gleiche Warnung, obwohl meine App gut zu laufen schien. Das Problem war, dass ich beim Ausführen von Editor> NSManagedObject-Unterklasse auf dem letzten Bildschirm den Standardspeicherort der Gruppe ohne angezeigte oder aktivierte Ziele verwendet habe, wodurch die Unterklasse im obersten MyApp-Verzeichnis gespeichert wurde, in dem sich MyApp.xcodeproj befand.
Die Warnung verschwand, als ich stattdessen die Gruppe in den MyApp-Unterordner änderte und das MyApp-Ziel überprüfte.
quelle
Die obigen Antworten waren hilfreich. Diese schnelle Überprüfung der geistigen Gesundheit kann Ihnen Zeit sparen. Gehen Sie zu Projekt> Phasen erstellen> Quellen kompilieren und entfernen Sie Ihr xcdatamodeld und Ihre Modelldateien mit der Schaltfläche "-". Fügen Sie sie dann mit der Schaltfläche "+" wieder hinzu. Wiederaufbau - das kann sich darum kümmern.
quelle
Übrigens, seien Sie vorsichtig, was Sie als Präfix hinzufügen: Meine App heißt "ABC-def" und Xcode hat das "-" in ein "_" umgewandelt.
Um sicher zu gehen, schauen Sie in den Finder, suchen Sie Ihre Projektdateien und sehen Sie, was darin für Ihr Datenmodell steht (zum Beispiel "ABC_def.xcdatamodeld") und verwenden Sie das, was dort genau geschrieben steht !!!
quelle
Die obigen Antworten haben mir geholfen, verschiedene Probleme im Zusammenhang mit Objective-C zu lösen (vielleicht hilft es jemandem):
Wenn Sie Entitätsnamen überarbeitet haben, vergessen Sie nicht, "Klasse" auch im "Dienstprogrammfenster" zu ändern.
quelle
Die obigen Antworten haben mir geholfen, aber das kann jemandem helfen. Wenn Sie sie wie ich gemacht haben und immer noch ein Problem haben, denken Sie daran, einfach Ihr Projekt zu bereinigen. Für XCode8 Produkt> Reinigen. Dann wieder laufen.
quelle
In Xcode 7 können Entitäts- und Klassennamen identisch sein, Codegen sollte jedoch Klassendefinition sein. In diesem Fall erfolgt keine Warnung usw. Geben Sie hier die Bildbeschreibung ein
quelle