Подтвердить что ты не робот

Решение "Не удалось вызвать назначенный инициализатор в классе NSManagedObject"

Я новичок в Swift, и я пытаюсь научиться использовать Core Data. Но я получаю эту ошибку, и я не уверен, что я сделал неправильно. Я искал в Интернете и пробовал несколько вещей, но я не могу понять это.

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

Когда эта строка выполняется:

ncvc.currentCourse = newCourse

В этой функции:

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

    }
}

Класс, созданный с помощью "Создать подкласс NSManagedObject..." для объекта курса:

import Foundation
import CoreData

class Course: NSManagedObject {

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

}

и

import Foundation
import CoreData

extension Course {

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

}
4b9b3361

Ответ 1

Проблема заключается не в коде в вашем вопросе, а в фрагменте, который вы включили в качестве комментариев к другому ответу:

var currentCourse = Course()

Это не просто объявляет currentCourse типом Course, но также создает экземпляр объекта Course, используя стандартный метод init. Это явно не допускается: вы должны использовать назначенный инициализатор: init(entity entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?). Это описано в документации Apple здесь.

Я подозреваю, что вы никогда не используете экземпляр, созданный указанным выше определением var, поэтому просто определите его как тип Course?:

var currentCourse : Course?

Поскольку это необязательно, вам не нужно устанавливать начальное значение, но вам нужно разворачивать значение всякий раз, когда оно используется.

Ответ 2

У меня была такая же проблема. И создание экземпляра объекта, как это сработало, для вашего курса было бы примерно так:

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

вместо:

var currentCourse = Course()

Ответ 3

Самый простой способ:

  • Определить в applicationDelegate ссылку для контекста
  • Создайте экземпляр переменной, передав контекст

В AppDelegate (вне скобок):

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

И в коде:

let currentCourse = Course(context:context)

Теперь вы создали свою сущность. Но не забудьте сохранить с помощью:

appDelegate.saveContext()

Ответ 4

Я использовал это в Xcode 8.3.2 с Swift 3.1.

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

И получил то же сообщение об ошибке. Но эти данные были вставлены в db. Так что, возможно, это не имеет значения.