swift2 正在解决'未能对NSManagedObject类调用指定初始值设定项'

oymdgrw7  于 2022-11-06  发布在  Swift
关注(0)|答案(5)|浏览(175)

我是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?

}
jmp7cifd

jmp7cifd1#

问题不在于你问题中的代码,而在于你作为对另一个答案的注解而包含的代码片段:

var currentCourse = Course()

这不仅声明currentCourseCourse类型,还使用标准的init方法创建了Course实体的一个示例。这是明确不允许的:必须使用指定的初始化程序:init(entity entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?)。此处的Apple文档中对此进行了描述。
我怀疑您从来没有使用过由上面的var定义创建的示例,因此只需将其定义为Course?类型即可:

var currentCourse : Course?

由于它是可选的,因此您不需要设置初始值,但无论何时使用它,您都需要展开该值。

fhity93d

fhity93d2#

最简单的方法是这样的:

  • 在应用程序中定义委派上下文的引用
  • 通过传递上下文示例化变量

在AppDelegate中(括号外):

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

而在代码中:

let currentCourse = Course(context:context)

现在你已经创建了你的实体。但是别忘了保存为:

appDelegate.saveContext()
hkmswyz6

hkmswyz63#

我也遇到了同样的问题。像这样示例化对象是有效的,对于你的课程来说,它应该是这样的:

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

而不是:

var currentCourse = Course()
yxyvkwin

yxyvkwin4#

我在Xcode 8.3.2和Swift 3.1中使用了这一功能。

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

得到了同样的错误信息。但是这些数据被插入到了数据库中。所以这可能不重要。

相关问题