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

时间:2016-02-18 06:08:57

标签: ios swift nsuserdefaults today-extension

我有一组数组,它​​们都包含我创建的自定义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文件,但似乎没有任何效果。同样的错误不断发生。任何投入将不胜感激!

4 个答案:

答案 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中存储的数组中检索简单数据没有问题。

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