2016-08-10 2 views
0

У меня есть пользовательский объект (который является словарем строк), который создается, когда пользователь нажимает кнопку.Как использовать NSCoding для сохранения пользовательского объекта в массив с помощью NSUserDefaults в Swift?

При создании этого объекта, я использую следующий код для добавления, а затем сохранить его в массив:

createdObjectsArray.append(createdObject) // Append the object to the array 
NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(createdObjectsArray), forKey: "createdObjectsArray") 
      NSUserDefaults.standardUserDefaults().synchronize() 

Я объявил createdObjectsArray как:

var createdObjectsArray = NSUserDefaults.standardUserDefaults().objectForKey("createdObjectsArray") as? [CustomObject] ?? [CustomObject]() 

Однако, мой код для сохранения массива, похоже, не работает, поскольку количество элементов, содержащихся в массиве, равно 0, когда приложение полностью закрыто на iOS.

см ниже моей декларации 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"); 
    } 
} 

Я на самом деле не получаю никаких сообщений об ошибках, выводимых на консоль, когда элементы добавляются в массив, вместо этого, createdObjectsArray просто пустым. У меня есть подозрения, что проблема заключается либо в первоначальном объявлении моего объекта, либо в том, как я сохраняю элементы в массиве (просто добавляя его).

ответ

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… 
    } 
} 
+0

Я использую: 'NSUserDefaults.standardUserDefaults(). SetObject (NSKeyedArchiver.archivedDataWithRootObject (createdObjectsArray), forKey:" createdObjectsArray ")' - есть ли какие-либо указания, почему это не будет работать? –

 Смежные вопросы

  • Нет связанных вопросов^_^