2016-05-23 60 views
0

当我调用函数CacheStation时,出现错误:CoreData:error:无法调用NSManagedObject类SaveModel上的指定初始值设定项。没有什么比这更少。我该如何解决这个问题?CoreData:error:无法调用NSManagedObject自定义类上的指定初始化程序

SaveModel.swift:

import Foundation 
    import CoreData 
    import UIKit 

class SaveModel: NSManagedObject { 

    func CacheStations(){ 
     // create an instance of our managedObjectContext 
     let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 

     // we set up our entity by selecting the entity and context that we're targeting 
     let entity = NSEntityDescription.insertNewObjectForEntityForName("CachedStations", inManagedObjectContext: moc) as! SaveModel 

     //add the data 
     entity.land = "nl"; 

     // we save our entity 
     do { 
      try moc.save() 
     } catch { 
      fatalError("Failure to save context: \(error)") 
     } 
} 

SaveModel + CoreDataProperties.swift:

import Foundation 
import CoreData 

extension SaveModel { 
    @NSManaged var land: String? 
} 

当我打电话CacheStations:

import UIKit 

class ViewController: UIViewController { 

    @IBAction func saveShizzle(sender: AnyObject) { 
     let sm = SaveModel(); 
     sm.CacheStations(); 
    } 
} 
+0

请您可以显示代码在哪里调用CacheStations? – pbasdf

+0

@pbasdf添加了代码,我更进了一步,它让崩溃让sm = SaveModel(); – da1lbi3

回答

1

这条线:

let sm = SaveModel(); 

使用标准init()方法创建的SaveModel的实例,但NSManagedObjects必须使用指定的初始化剂被初始化:

init(entity entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) 

(或,如在您的CacheStations方法,使用NSEntityDescription.insertNewObjectForEntityForName(_, inManagedObjectContext: moc)调用指定的初始化程序)。

因为它似乎sm只创建有一个实例上调用CacheStations,我将这种方法变成一个类方法:

class func CacheStations(){ 

,改变你的saveShizzle方法使用类方法:

@IBAction func saveShizzle(sender: AnyObject) { 
    SaveModel.CacheStations(); 
} 
0

这里发生了什么:

  1. 当您致电let sm = SaveModel();时,您正在创建SaveModel的新实例。
  2. SaveModelNSManagedObject
  3. NSManagedObject一个子类有一个叫指定初始化init(_: insertIntoManagedObjectContext:)
  4. 子类中不添加任何类型的,这意味着你必须调用父类的指定初始化的任何初始化。
  5. 你不这样做,所以你会得到一个错误消息,描述确切的问题。

您需要可以致电NSManagedObject指定初始化或创建自己指定的初始化,调用父类指定初始化。

相关问题