我是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?
}
5条答案
按热度按时间jmp7cifd1#
问题不在于你问题中的代码,而在于你作为对另一个答案的注解而包含的代码片段:
这不仅声明
currentCourse
为Course
类型,还使用标准的init
方法创建了Course
实体的一个示例。这是明确不允许的:必须使用指定的初始化程序:init(entity entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?)
。此处的Apple文档中对此进行了描述。我怀疑您从来没有使用过由上面的var定义创建的示例,因此只需将其定义为
Course?
类型即可:由于它是可选的,因此您不需要设置初始值,但无论何时使用它,您都需要展开该值。
fhity93d2#
最简单的方法是这样的:
在AppDelegate中(括号外):
而在代码中:
现在你已经创建了你的实体。但是别忘了保存为:
hkmswyz63#
我也遇到了同样的问题。像这样示例化对象是有效的,对于你的课程来说,它应该是这样的:
而不是:
yxyvkwin4#
我在Xcode 8.3.2和Swift 3.1中使用了这一功能。
得到了同样的错误信息。但是这些数据被插入到了数据库中。所以这可能不重要。
6ioyuze25#
您的
currentCourse
应该是NSManagedObject类别请参阅此CoreData: error: Failed to call designated initializer on NSManagedObject class