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

Cannot retrieve data from NSUserDefaults into today extension (Swift)

我有一组数组,它​​们都包含我创建的自定义任务对象的多个实例。我将数组保存到 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 本身设置和检索数据。但是,当尝试通过 today 扩展检索数据时,此方法不起作用。

当我试图从 today 扩展的 .swift 文件中检索时,出现以下错误:

  • Failed to inherit CoreMedia permissions from 52550: (null)

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


我知道分机可以读取数据,因为当我调用时:

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

我收到打印的回复..


我可以通过 today 扩展成功保存和检索整数,但不能 objectForKey


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

设置对象

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")

解决方法:

所以我找到了解决我的问题的方法(实际上更有效)。因为 [Task] 的解码导致了问题,我决定继续从一个没有对象的数组中检索数据,而只是 NSDate() 个实例。因此,我现在可以保存和访问今天扩展所需的重要数据方面。我敦促其他遇到自定义 class 解码问题的人尽可能尝试简化您的数据,以便在您的扩展程序中检索和使用它。我不确定问题是什么或现在是什么,但是从存储在 NSUserDefaults 中的数组中检索简单数据没有问题。

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

另一种方法是修复用于 NSCoding 的 class 的名称。您只需使用:

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

任何需要的地方。

看起来 iOS 扩展名在 class 名称前加上扩展名。