2016-02-27 1 views
0

J'ai vraiment été coincé sur cette question et j'ai parlé this après stackoverflow, mais mon application se bloque toujours la question:Échec d'appeler désigné Initializer de classe NSManagedObject - CoreData

Échec d'appeler désigné Initializer sur NSManagedObject Classe

Donc, j'ai plusieurs entités et j'ai sous-classé le NSManagedObject. Supposons que j'ai des entités nommées: FirstEntity, SecondEntity, ThirdEntity, Fourth Entity, FifthEntity. Faisons également semblant d'avoir deux attributs nommés firstAttribute, secondAttribute dans chaque entité. Je suis allé dans le xcdatamold ouvert l'éditeur, puis sélectionné créer NSManagedObject sous-classe pour toutes mes entités. Ensuite, je voulais instancier de chacun de ces nouveaux sous-types afin que je puisse accéder aux attributs à l'intérieur du FirstEntity. J'ai donc écrit ce code:

let firstEntity = FirstEntity() 

Puis, quand je lance l'application, il se bloque, donc j'édita plus avec un soupçon de poste stackoverflow et maintenant voici mon code:

let firstEntityName = NSEntityDescription.entityForName("FirstEntity", inManagedObjectContext: managedObject) 

let firstEntity = FirstEntity.init(entity: firstEntity!, insertIntoManagedObjectContext: managedObject) 

Cependant, mon code est toujours en panne. Je suis vraiment désemparé, parce que tous les messages de débordement de pile concernant le problème ont dit de faire ci-dessus, mais mon code est toujours écrasant avec le Échec d'appeler l'initialisateur désigné sur NSManagedObject Class erreur.

Des suggestions?

Répondre

3

Vous ne devez pas créer d'objets gérés vous-même via un initialiseur. Au lieu de cela, vous appelez la fonction insertNewObjectForEntityForName:inManagedObjectContext: de NSEntityDescription. Sur la base de:

let firstEntity = NSEntityDescription.insertNewObjectForEntityForName("FirstEntity", inManagedObjectContext: managedObject) 

Ce qui précède définit firstEntity comme instance de NSManagedObject. En supposant que vous avez créé une FirstEntity sous-classe de NSManagedObject par Interface Builder, vous pouvez plutôt utiliser:

let firstEntity = NSEntityDescription.insertNewObjectForEntityForName("FirstEntity", inManagedObjectContext: managedObject) as! FirstEntity 
firstEntity.firstAttribute = // Whatever 
+0

Salut, merci pour votre réponse. Si je fais cela pour une raison quelconque, le code 'firstEntity.firstAttribute' ne fonctionnera pas. Comment puis-je référencer les attributs dans chaque entité en utilisant votre code? – Harish

+0

Super, ça a marché :). – Harish

0

La façon la plus simple est la suivante:

  • Définir dans la applicationDelegate une référence pour le contexte
  • Instantiate la variable en passant le contexte

Dans l'AppDélégué (hors les parenthèses):

let appDelegate = UIApplication.shared.delegate as! AppDelegate 
let context = appDelegate.persistentContainer.viewContext 

Et dans le code:

let firstEntity = FirstEntity(context:context) 

Maintenant que vous avez votre entité créée. Mais n'oubliez pas de sauvegarder avec:

appDelegate.saveContext()