Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift CoreData: error: Failed to call designated initializer on NSManagedObject class 'NSManagedObject'

I'm using core data to save a category in vc1 and want to add list properties to a list in vc2. My data model is one category to many list properties.

I'm adding the category like this in vc1:

func createNewCategory() {
    var category: NSManagedObject! = NSEntityDescription.insertNewObjectForEntityForName("Category", inManagedObjectContext: self.context) as NSManagedObject
    category.setValue(self.categoryTextField.text, forKey: "name")

    var error: NSError? = nil
    self.context.save(&error)
}

Setting up the data in vc2:

func setupCoreData() {
    var appDelegate: AppDelegate = (UIApplication.sharedApplication()).delegate as AppDelegate
    self.context = appDelegate.managedObjectContext!

    var request: NSFetchRequest = NSFetchRequest(entityName: "Category")
    if (self.context.executeFetchRequest(request, error: nil)) {
        var error: NSError? = nil
        self.listData = self.context.executeFetchRequest(request, error: &error)
        self.managedObject = self.listData.objectAtIndex(0) as NSManagedObject
    }
}

It crashes on the last row: self.managedObject = ... saying:

CoreData: error: Failed to call designated initializer on NSManagedObject class 'NSManagedObject' 

The managed object is in the array if I put a break point and print the array. What's wrong?

like image 634
Johannes Olsson Avatar asked Aug 26 '14 11:08

Johannes Olsson


1 Answers

The dedicated initializer is

class func insertNewObjectForEntityForName(_ entityName: String!,
   inManagedObjectContext context: NSManagedObjectContext!) -> AnyObject!

Clearly, you are not inserting a new object, so you really want an optional value. Maybe you declared your class variable managedObject as NSManagedObject!? Try setting it to NSManagedObject? and also change the operator to as?.

like image 53
Mundi Avatar answered Oct 27 '22 09:10

Mundi