存档和取消归档自定义类(具有属性作为对象数组),始终失败

时间:2017-01-24 05:17:14

标签: swift archive

我在网上搜索了很长时间。但没用。请帮助或尝试提供一些如何实现这一目标的想法。

当unarchive应用程序崩溃时,我收到此消息:

Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 
'*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (_TtCC11ArchiveTest8dogHouse3dog) 
for key (NS.objects); the class may be defined in source code or a library that is not linked'

这意味着什么? 有人帮忙吗?先谢谢。

现在,我认识到终止因为其他代码,如下所示: enter image description here

如果我尝试: enter image description here 它做得好,买为什么?在viewDidLoad中写代码做什么呢?哪个方法链接了这个类?

我有一个班级:

let ModelPath = "Model.plist".cacheDir()

class dogHouse: NSObject , NSCoding{

 var dogs:[Dog]?

required init(coder aDecoder: NSCoder)
{
    dogs = aDecoder.decodeObject(forKey: "dogs") as? [Dog]
    super.init()
}

func encode(with aCoder: NSCoder) {
    if dogs != nil{
        aCoder.encode(dogs, forKey: "dogs")
    }

}

class Dog: NSObject , NSCoding {

    var name : String?

    required init(coder aDecoder: NSCoder)
    {
        name = aDecoder.decodeObject(forKey: "name") as! String?
        super.init()
    }

    func encode(with aCoder: NSCoder) {
        if name != nil{
            aCoder.encode(name, forKey: "name")
        }

    }

    //ArchiveModels
    func saveModel() -> Bool{
     return NSKeyedArchiver.archiveRootObject(self, toFile: ICModelPath)
    }

    //UnArchiveModels
    class func loadArchiver() -> [Dog]?{
      let obj = NSKeyedUnarchiver.unarchiveObject(withFile: ICModelPath)
      if obj != nil {
         print(obj.debugDescription)
         let model = obj as? dogHouse
         return model?.dogs
      }
     return nil
    }

}

1 个答案:

答案 0 :(得分:0)

也许您错过了init函数中的参数?

required init(coder aDecoder: NSCoder)
{
    dogs = aDecoder.decodeObject(forKey: "dogs") as? [Dog]
    super.init(aDecoder) //HERE
}