如何使用NSCoding在Swift中使用NSUserDefaults将自定义对象保存到数组?

时间:2016-08-10 13:30:29

标签: ios swift2 nsuserdefaults nscoding

我有一个自定义对象(字符串字典),当用户点击按钮时会创建该对象。

创建此对象时,我使用以下代码添加然后将其存储在数组中:

- (void)signInWillDispatch:(GIDSignIn *)signIn error:(NSError *)error {
    if (GIDSignIn.delegate != self) {NSLog("gotcha!")}
}

我已将 createdObjectsArray.append(createdObject) // Append the object to the array NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(createdObjectsArray), forKey: "createdObjectsArray") NSUserDefaults.standardUserDefaults().synchronize() 声明为:

createdObjectsArray

但是,当我的应用程序在iOS上完全关闭时,保存数组的代码似乎不起作用,因为数组中包含的元素数量为0。

请参阅下面的var createdObjectsArray = NSUserDefaults.standardUserDefaults().objectForKey("createdObjectsArray") as? [CustomObject] ?? [CustomObject]() 声明:

CustomObject

当项目添加到此数组时,我实际上并没有将任何错误消息输出到控制台,相反,class CustomObject : NSObject, NSCoding { var objectName: String? var objectColour: String? var objectWeight: String? init(json: NSDictionary) { // Dictionary object self.objectName = json["objectName"] as? String self.objectColour = json["objectColour"] as? String self.objectWeight = json["objectWeight"] as? String } required init?(coder aDecoder: NSCoder) { self.objectName = aDecoder.decodeObjectForKey("objectName") as? String; self.objectColour = aDecoder.decodeObjectForKey("objectColour") as? String; self.objectWeight = aDecoder.decodeObjectForKey("objectWeight") as? String; } func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(self.objectName, forKey: "objectName"); aCoder.encodeObject(self.objectColour, forKey: "objectColour"); aCoder.encodeObject(self.objectWeight, forKey: "objectWeight"); } } 只是空白。我怀疑问题是我的对象的原始声明或我将项目保存到数组的方式(只需附加它)。

1 个答案:

答案 0 :(得分:0)

您无法将自定义对象数组存储到NSUserDefaults

我认为最适合您的方法是使用NSKeyedArchiver将您的数组转换为NSData,并将此数据存储在NSUserDefaults

一些代码:

let array: [CustomObject] = [...]
let data = NSKeyedArchiver.archivedDataWithRootObject(array)
createdObjectsArray.setObject(data, forKey: "createdObjectsArray")

阅读数据:

if let savedData = createdObjectsArray.objectForKey("createdObjectsArray") as? NSData {
    if let array = NSKeyedUnarchiver.unarchiveObjectWithData(savedData) as? [CustomObject] {
        // do something…
    }
}