无法从NSUserDefaults检索数据到今天的扩展(Swift)

我有一组数组,这些数组都包含一些我创build的自定义Task对象的实例。 我将数组保存到NSUserDefaults,如下所示:

自定义任务对象

class Task:NSObject, NSCoding { var name:String var notes:String var date:NSDate var dateUse:Bool var taskCompleted:Bool init(name:String, notes:String, date:NSDate, dateUse:Bool, taskCompleted:Bool){ self.name = name self.notes = notes self.date = date self.dateUse = dateUse self.taskCompleted = taskCompleted } required init(coder decoder: NSCoder){ self.name = decoder.decodeObjectForKey("name") as! String self.notes = decoder.decodeObjectForKey("notes") as! String self.date = decoder.decodeObjectForKey("date") as! NSDate self.dateUse = decoder.decodeObjectForKey("dateUse") as! Bool self.taskCompleted = decoder.decodeObjectForKey("taskCompleted") as! Bool } func encodeWithCoder(coder: NSCoder) { coder.encodeObject(self.name, forKey: "name") coder.encodeObject(self.notes, forKey: "notes") coder.encodeObject(self.date, forKey: "date") coder.encodeObject(self.dateUse, forKey: "dateUse") coder.encodeObject(self.taskCompleted, forKey: "taskCompleted") } } 

保存:

 let defaults = NSUserDefaults(suiteName: "group.com.myGroupName") let nowData = NSKeyedArchiver.archivedDataWithRootObject(nowTasks) defaults!.setObject(nowData, forKey: "nowData") 

检索

 let nowDataPull = defaults!.objectForKey("nowData") as? NSData if let nowDataPull2 = nowDataPull{ let nowTasks2 = NSKeyedUnarchiver.unarchiveObjectWithData(nowDataPull2) as? [Task] if let nowTasks21 = nowTasks2{ nowTasks = nowTasks21 } } 

上述方法适用于从iPhone本身设置和检索数据。 但是,尝试通过今天的扩展名检索数据时,此方法不起作用。

当试图从今天的扩展名.swift文件检索时,我得到以下错误:

  • 无法从52550inheritanceCoreMedia权限:(null)

  • 由于未捕获exception'NSInvalidUnarchiveOperationException',原因:'* – [NSKeyedUnarchiver decodeObjectForKey:]:无法为键(NS.objects)解码类(MyAppName.Task)的对象。 该类可以在源代码或未链接的库中定义“


我知道扩展名可以读取数据,因为当我打电话时:

 if (defaults?.objectForKey("nowData") != nil){ print("there is data") } 

我得到打印的回应..


我可以成功地保存一个整数,并通过今天的扩展,而不是objectForKey


我已经尝试过各种其他的保存方法,包括.plist文件,但似乎没有任何工作。 同样的错误不断发生。 任何投入将不胜感激!

另一种方法是修复用于NSCoding的类的名称。 你只需要使用:

  • NSKeyedArchiver.setClassName("Task", forClass: Task.self序列化前
  • 反序列化之前的NSKeyedUnarchiver.setClass(Task.self, forClassName: "Task")

在需要的地方。

看起来iOS扩展在类名的后面加上扩展名。

 let default = NSUserDefault() default.objectForKey("key") 

设置对象

 let defaults = NSUserDefaults.standardUserDefaults() defaults.setObject("iOS", forKey: "userNameKey") defaults.setInteger(25, forKey: "Age") defaults.setBool(true, forKey: "UseTouchID") defaults.setDouble(M_PI, forKey: "Pi") 

 let defaults = NSUserDefaults.standardUserDefaults() let name = defaults.stringForKey("userNameKey") 

解决方法:

所以我find了解决方法(这实际上是更有效的)我的问题。 由于[Task]的解码导致了问题,因此我决定继续从内部没有对象的数组中检索数据,而只检索NSDate()实例的数据。 正因为如此,我现在可以保存和访问今天扩展需要的数据的重要方面。 我鼓励任何有自定义类解码问题的人尽可能地尝试简化数据,以便在您的扩展中检索和使用它。 我不完全确定问题是什么,但是从存储在NSUserDefaults的数组中检索简单数据没有问题。

希望所有这些废话可以帮助别人!