Решение "Не удалось вызвать назначенный инициализатор в классе 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?
}
Ответы
Ответ 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. Так что, возможно, это не имеет значения.
Ответ 5
Ваш currentCourse
должен быть классом NSManagedObject
Пожалуйста, обратитесь к CoreData: error: Не удалось вызвать назначенный инициализатор в классе NSManagedObject