Je travaille sur le développement d'une application avec Core Data. Lorsque j'ai créé une instance en utilisant:
let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: appDelegate.managedObjectContext)
let user = User(entity: entity, insertIntoManagedObjectContext: appDelegate.managedObjectContext)
J'ai un avertissement dans le journal:
CoreData: warning: Unable to load class named 'User' for entity 'User'. Class not found, using default NSManagedObject instead.
Comment pourrais-je résoudre ce problème?
Et une autre question, comment puis-je définir une méthode d'instance dans la sous-classe NSManagedObject?
Éditer:
J'ai spécifié la classe de l'entité comme dans la capture d'écran suivante:
ios
core-data
swift
nsmanagedobject
MsrPapillon
la source
la source
Réponses:
Mise à jour pour Xcode 7 (finale): il n'est plus nécessaire de préparer le nom du module dans la classe (comme dans Xcode 6 et les premières versions bêta de Xcode 7). La documentation Apple Implémentation des sous-classes d'objets gérés par Core Data a été mise à jour en conséquence.
L'inspecteur de modèle de données comporte désormais deux champs «Classe» et «Module» pour une entité:
Lorsque vous créez une sous-classe d'objets gérés Swift pour l'entité, le champ «Module» est défini sur «Module de produit actuel» et, avec ce paramètre, la création d'instances fonctionne à la fois dans l'application principale et dans les tests unitaires. La sous-classe d'objets gérés ne doit pas être marquée
@objc(classname)
(ceci a été observé dans https://stackoverflow.com/a/31288029/1187415 ).Vous pouvez également vider le champ «Module» (il affichera «Aucun») et marquer les sous-classes d'objets gérés avec
@objc(classname)
(cela a été observé dans https://stackoverflow.com/a/31287260/1187415 ).Remarque: Cette réponse a été écrite à l'origine pour Xcode 6. Il y a eu quelques changements dans les différentes versions bêta de Xcode 7 par rapport à ce problème. Puisqu'il s'agit d'une réponse acceptée avec de nombreuses votes favorables et des liens vers elle, j'ai essayé de résumer la situation pour la version finale actuelle de Xcode 7.
J'ai fait mes propres "recherches" et lu toutes les réponses à la fois à cette question et à la question similaire CoreData: avertissement: Impossible de charger la classe nommée . L'attribution va donc à tous, même si je ne les énumère pas spécifiquement!
Réponse précédente pour Xcode 6 :
Comme indiqué dans Implémentation des sous - classes d'objets gérés par Core Data , vous devez préfixer le nom de la classe des entités dans le champ Classe de l'inspecteur d'entités de modèle avec le nom de votre module, par exemple "MyFirstSwiftApp.User".
la source
@objc(ClassName)
méthode suggérée dans la réponse de Christer.Juste comme note d'accompagnement. J'ai eu le même problème. Et tout ce que j'avais à faire était d'ajouter
@objc(ClassName)
dans mon dossier de classe.Exemple:
Et cela a résolu mon problème.
la source
La réponse acceptée à cette question m'a aidé à résoudre le même problème, mais j'avais une mise en garde qui, à mon avis, serait utile pour les autres. Si le nom de votre projet (module) contient un espace, vous devez remplacer l'espace par un trait de soulignement. Par exemple:
Entité: MyEntity Classe: My_App_Name.MyClass
la source
N'oubliez pas de supprimer votre module :
la source
Selon que vous exécutez en tant qu'application vs tests, le problème peut être que l'application recherche
<appName>.<entityName>
et lorsqu'elle s'exécute en tant que test, elle ressemble<appName>Tests.<entityName>
. La solution que j'utilise actuellement (Xcode 6.1) est de NE PAS remplir leClass
champ dans l'interface utilisateur CoreData, et de le faire dans le code à la place.Ce code détectera si vous exécutez en tant qu'application vs tests, utilisez le bon nom de module et mettez à jour le fichier
managedObjectClassName
.la source
Si vous utilisez un trait d'union dans le nom de votre projet comme "My-App", utilisez un trait de soulignement au lieu du trait d'union comme "My_App.MyManagedObject". En général, regardez le nom du fichier xcdatamodeld et utilisez le même préfixe que dans ce nom. Ie "My_App_1.xcdatamodeld" nécessite le préfixe "My_App_1"
la source
Cela peut aider ceux qui rencontrent le même problème. J'étais, avec Swift 2 et Xcode 7 beta 2.
La solution dans mon cas était de commenter
@objc(EntityName)
dansEntityName.swift
.la source
J'ai eu le même avertissement, même si mon application semblait fonctionner correctement. Le problème était que lors de l'exécution de Editor> Create NSManagedObject Subclass sur le dernier écran, j'ai utilisé l'emplacement du groupe par défaut, sans aucune cible affichée ni cochée, ce qui a enregistré la sous-classe dans le répertoire MyApp supérieur où MyApp.xcodeproj était situé.
L'avertissement a disparu lorsque j'ai plutôt changé le groupe pour qu'il se trouve dans le sous-dossier MyApp et vérifié la cible MyApp.
la source
Les réponses ci-dessus ont été utiles. Cette vérification rapide de la cohérence peut vous faire gagner du temps. Allez dans Projet> Phases de construction> Compiler les sources et supprimez votre xcdatamodeld et vos fichiers de modèle avec le bouton "-", puis ajoutez-les tout de suite avec le bouton "+". Reconstruire - cela peut s'en occuper.
la source
Au fait, soyez prudent avec ce que vous ajoutez comme préfixe: mon application s'appelle "ABC-def" et Xcode a converti le "-" en "_".
Pour être sûr, regardez dans le Finder, trouvez vos fichiers de projet et voyez ce qu'il dit pour votre modèle de données (par exemple "ABC_def.xcdatamodeld") et utilisez ce qui y est écrit EXACTEMENT !!!
la source
Les réponses ci-dessus m'ont aidé à résoudre différents problèmes liés à Objective-C (peut-être que cela aidera quelqu'un):
Si vous avez refactoré les noms d'entités, n'oubliez pas de modifier également "Classe" dans "Panneau Utilitaires".
la source
Les réponses ci-dessus m'ont aidé, mais cela peut aider quelqu'un. Si comme moi vous les avez fait et que vous rencontrez toujours un problème, n'oubliez pas de simplement «nettoyer votre projet». Pour XCode8, Produit> Nettoyer. Puis exécutez à nouveau.
la source
Dans Xcode 7, les noms d'entité et de classe peuvent être identiques, mais Codegen doit être une définition de classe. Dans ce cas, il n'y aura pas d'avertissement, etc. entrez la description de l'image ici
la source