2015-10-23 1 views
19

Ich bin neu in Swift und ich versuche zu lernen, wie Sie Core Data verwenden. Aber ich bekomme diesen Fehler und ich bin mir nicht sicher, was ich falsch gemacht habe. Ich habe online gesucht und einige Dinge ausprobiert, aber ich kann es nicht richtig machen.Auflösen 'Konnte nicht benannten Initialisierer auf NSManagedObject-Klasse aufrufen'

Failed to call designated initializer on NSManagedObject class 'FirstCoreData.Course' 

Wenn diese Zeile ausführt:

ncvc.currentCourse = newCourse 

In dieser Funktion:

class TableViewController: UITableViewController, AddCourseViewControllerDelegate { 

var managedObjectContext = NSManagedObjectContext.init(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType) 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "addCourse" { 
     let ncvc = segue.destinationViewController as! NewCourseViewController 
     ncvc.delegate = self 

     let newCourse = NSEntityDescription.insertNewObjectForEntityForName("Course", inManagedObjectContext: self.managedObjectContext) as! Course 
     ncvc.currentCourse = newCourse 

    } 
} 

Klasse, die von "Create NSManagedObject Subclass ..." für Course Einheit:

import Foundation 
import CoreData 

class Course: NSManagedObject { 

// Insert code here to add functionality to your managed object subclass 

} 

Und:

import Foundation 
import CoreData 

extension Course { 

    @NSManaged var title: String? 
    @NSManaged var author: String? 
    @NSManaged var releaseDate: NSDate? 

} 

Antwort

45

Das Problem liegt nicht in den Code in Ihrer Frage, aber im Snippet Sie als Kommentar auf die andere Antwort enthalten:

var currentCourse = Course() 

Das gilt nicht nur currentCourse deklarieren von Course Typ sein, ich t erstellt auch eine Instanz der Course Entität unter Verwendung der Standardmethode init. Dies ist ausdrücklich nicht erlaubt: Sie müssen den angegebenen Initialisierer verwenden: init(entity entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?). Dies wird in der Apple-Dokumentation here beschrieben.

Ich vermute, dass Sie jemals nicht die Instanz durch die oben var Definition erstellt verwenden, so definieren es einfach als Typ zu sein Course?:

var currentCourse : Course? 

Da es optional ist, brauchen Sie nicht eine anfängliche einstellen Wert, obwohl Sie den Wert jedes Mal auspacken müssen, wenn es verwendet wird.

+0

Danke @pdasdf es funktioniert gut für mich. – Chetan

+0

Richtiger Rat! Groß. –

0

Ihre currentCourse sollte NSManagedObject Klasse

Bitte lesen Sie diese CoreData: error: Failed to call designated initializer on NSManagedObject class

+0

Wenn ich currentCourse als NSManagedObject deklariere ich werde den Zugriff auf den Titel, Autor und ReleaseDate Mitglieder verlieren. Also weiß ich nicht, wie ich auf die Entitätsattribute zugreifen kann. – Daniel

+0

Ich denke, dass currentCourse auch die Kursklasse ist, damit Sie die Entitäten nicht verlieren. – Vijay

+0

Entschuldigung, ich verstehe nicht. Im Moment habe ich var currentCourse = Course(). Wenn ich das in var currentCourse = NSManagedObject() ändere, dann sagt alles, was sich auf die Mitglieder von Course bezieht (z.B. currentCourse.title), dass "title kein Mitglied von NSManagedObject" ist. – Daniel

7

Ich hatte das gleiche Problem. Und das Objekt zu erhalten, wie dies funktioniert, für Ihren Natürlich wäre es so etwas wie dieses:

var currentCourse = Course.init(entity: NSEntityDescription.entityForName("Course", inManagedObjectContext:mox)!, insertIntoManagedObjectContext: mox) 

statt:

var currentCourse = Course() 
2

habe ich dies in Xcode 8.3.2 mit Swift 3.1.

NSEntityDescription.insertNewObject(forEntityName: String(describing: type(of: Record())), into: managedObjectContext) as! Record 

Und die gleiche Fehlermeldung erhalten. Aber diese Daten wurden in db eingefügt. Also vielleicht ist das egal.

3

Der einfachste Weg ist das:

  • im applicationDelegate für den Kontext eine Referenz definieren
  • die Variable Instanziieren durch den Kontext

Im AppDelegate Passing (außerhalb der Klammern):

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

Und im code:

let currentCourse = Course(context:context) 

Jetzt haben Sie Ihre Entität erstellt. Aber nicht vergessen zu speichern mit: