Je duplique une application Objective-C TV Show existante vers une nouvelle version Swift à l'aide de Xcode 6.1 et j'ai des problèmes avec CoreData.
J'ai créé un modèle de 4 entités, créé leur sous-classe NSManagedObject (dans Swift) et tous les fichiers ont les cibles d'application appropriées définies (pour 'Compile Sources').
J'obtiens toujours cette erreur chaque fois que j'essaye d'insérer une nouvelle entité:
CoreData: avertissement: impossible de charger la classe nommée «Shows» pour l'entité «Shows». Classe introuvable, utilisant à la place NSManagedObject par défaut.
Quelques remarques:
Lors de l'enregistrement dans Core Data, j'utilise la méthode de contexte parent-enfant pour autoriser le thread en arrière-plan. Je fais cela en configurant le ManagedObjectContext en utilisant:
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
}()
et en sauvegardant les données en utilisant:
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...
})
la source
@objc(MyClass)
Mais pour ceux qui utilisent
@objc(myEntity)
Swift (comme moi), vous pouvez utiliser cette autre solution à la place qui fonctionne bien.Dans la classe correcte xcdatamodel dans. Cela devrait ressembler à ceci:
Voici.
Module.Class
est le modèle pour CoreData dans Swift et XCode 6. Vous aurez également besoin de la même procédure lors de l'utilisation de la classe de stratégie personnalisée dans la stratégie de modèle ou d'autres éléments CoreData. A noter: dans l'image, le nom et la classe doivent être Car et MyAppName.Car (ou quel que soit le nom de votre entité). VoiciUser
une faute de frappe.la source
Car
pour les deux domaines a fait l'affaire.Lors de l'utilisation de Xcode 7 et purement Swift, je devais en fait supprimer
@objc(MyClass)
de maNSManagedObject
sous - classe générée automatiquement (générée à partir de Editor> Create NSManagedObject Subclass...).la source
Dans Xcode 7 beta 2 (et je crois 1), dans la configuration du modèle, un nouvel objet géré de type
File
est défini sur le moduleCurrent Product Module
et la classe de l'objet est affichée dans la configuration comme.File
.Supprimer le paramètre du module pour qu'il soit vide ou supprimer le point pour que le nom de la classe dans la configuration soit juste
File
sont des actions équivalentes, car chacune entraîne l'autre changement. L'enregistrement de cette configuration supprimera l'erreur décrite.la source
Dans Xcode 6.1.1, vous n'avez pas besoin d'ajouter l'attribut @objc car l'entité de base est un sous-ensemble d'une classe objc (NSManagedObject) (voir Compatibilité de type Swift . Dans CoreData, le nom Module.Class complet est requis. Attention au module nom est ce qui est défini dans Paramètres de construction -> Emballage -> Nom du module de produit. Par défaut, il est défini sur $ (PRODUCT_NAME: c99extidentifier) qui sera le nom de la cible .
la source
my-product
enmy_product
, et cela a fait toute la différence pour Core Data.Avec la version xCode 7 et Swift 2.0, vous n'avez pas besoin d'ajouter @objc (NameOfClass), modifiez simplement les paramètres de l'entité dans l'onglet "Afficher l'inspecteur de modèle de données" comme ci-dessous -
Nom - "Nom de votre entité"
Classe - "Nom de votre entité"
Module - "Module produit actuel"
Le code pour le fichier de classe d'entité sera comme (dans mon code l'entité est la famille) -
Cet exemple fonctionne bien dans mon application avec xCode 7.0 + swift 2.0
la source
N'oubliez pas de remplacer
PRODUCT_MODULE_NAME
par le nom de votre module produit.Lorsqu'une nouvelle entité est créée, vous devez accéder à l'inspecteur de modèle de données (dernier onglet) et le remplacer
PRODUCT_MODULE_NAME
par le nom de votre module, sinon il en résultera uneclass not found
erreur lors de la création du coordinateur de magasin persistant.la source
Vous devez également utiliser (au moins avec Xcode 6.3.2) Module.Class lors de votre distribution par exemple: En supposant que votre module (c'est-à-dire le nom du produit) est Food et que votre classe est Fruit
Résumer:
la source
J'ai également rencontré un problème similaire, suivez ces étapes pour résoudre :
la source
Changer le nom de la classe d'entité dans l'éditeur de modèle de données pour qu'il corresponde à la classe en question et l'ajout
@objc(NameOfClass)
au fichier de chaque NSManagedObject juste au-dessus de la déclaration de classe a résolu ce problème pour moi pendant les tests unitaires.la source
Ce qui a fonctionné pour moi (Xcode 7.4, Swift) est de changer le nom de la classe
<my actual class name>.<entity name>
dans l'inspecteur d'entités, dans la zone 'Classe'.Mon initiateur de la sous-classe d'objets gérés ressemble à ceci:
la source
Pour Xcode 11.5: si la propriété Codegen est une définition de classe, et si vous n'obtenez pas de suggestion pour l'entité que vous avez créée dans xcdatamodel. Essayez de quitter Xcode et de rouvrir votre projet. Ça marche pour moi. Cette réponse est seulement si vous n'obtenez pas de suggestions, mais si votre fichier n'est pas généré, essayez l'une des réponses ci-dessus.
la source