无法从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
的数组中检索简单数据没有问题。
希望所有这些废话可以帮助别人!