我有一组数组,它们都包含我创建的自定义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文件中检索时,我收到以下错误:
无法从52550继承CoreMedia权限:( null)
由于未捕获的异常'NSInvalidUnarchiveOperationException'而终止应用程序,原因:'* - [NSKeyedUnarchiver decodeObjectForKey:]:无法解码类的对象(MyAppName.Task) for key(NS.objects);该类可以用源代码或a来定义 未链接的库
我知道扩展程序可以读取数据,因为我打电话时:
if (defaults?.objectForKey("nowData") != nil){
print("there is data")
}
我收到了打印的回复..
我可以成功保存整数并通过今天的扩展程序检索,但不能objectForKey
我尝试了各种其他保存方法,包括.plist文件,但似乎没有任何效果。同样的错误不断发生。任何投入将不胜感激!
答案 0 :(得分:4)
另一种方法是修复用于NSCoding的类的名称。你只需要使用:
NSKeyedArchiver.setClassName("Task", forClass: Task.self
NSKeyedUnarchiver.setClass(Task.self, forClassName: "Task")
在任何需要的地方。
看起来iOS扩展名在类名前面加上扩展名。
答案 1 :(得分:1)
let default = NSUserDefault()
default.objectForKey("key")
答案 2 :(得分:1)
设置对象
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")
答案 3 :(得分:1)
解决方法:强>
所以我找到了解决问题的解决方法(实际上效率更高)。因为[Task]
的解码导致了问题,所以我决定继续从一个没有对象的数组中检索数据,而只是NSDate()
个实例。因此,我现在可以保存和访问今天扩展所需的数据的重要方面。我敦促任何有自定义类解码问题的人尽可能尝试简化数据,以便在您的扩展中检索和使用它。我不确定问题是什么或者是什么,但从NSUserDefaults
中存储的数组中检索简单数据没有问题。
希望所有这些废话可以帮助其他人!