2014-11-16 5 views
1

Я сохранить пользовательский объект Bottle со следующим кодомобъекты сохраняются с NSKeyedArchiver и загружены обратно в ноль

class Bottle: NSObject, NSCoding { 

    let id: String! 
    let title: String! 
    let year: Int! 
    let icon: UIImage! 


    init(id: String, title: String, year: Int, icon: UIImage) { 
     self.id = id 
     self.title = title 
     self.year = year 
     self.icon = icon 
    } 

    override init(){} 

    var bottlesArray = NSMutableArray() 

    // code inspired from http://stackoverflow.com/questions/24238868/swift-nscoding-not-working 

    required init(coder aDecoder: NSCoder) { 
     self.bottlesArray = aDecoder.decodeObjectForKey("bottleArray") as NSMutableArray 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encodeObject(bottlesArray, forKey: "bottleArray") 
    } 

    func add(bottle: Bottle) { 
     self.bottlesArray.addObject(bottle) 
    } 

    func save() { 
     let data = NSKeyedArchiver.archivedDataWithRootObject(self) 
     NSUserDefaults.standardUserDefaults().setObject(data, forKey: "bottleList") 
    } 

    class func loadSaved() -> Bottle? { 
     if let data = NSUserDefaults.standardUserDefaults().objectForKey("bottleList") as? NSData { 
      return NSKeyedUnarchiver.unarchiveObjectWithData(data) as? Bottle 
     } 
     return nil 
    } 

    func saveBottle(bottle: Bottle) { 
     let bottleList = Bottle.loadSaved() 
     bottleList?.add(bottle) 
     bottleList?.save() 
     let bottleList2 = Bottle.loadSaved() 
     println(bottleList2?.bottlesArray.count) 
     println(bottleList2?.bottlesArray[0].title) 
    } 
} 

откладываю 3 бутылки. Два последних println напечатайте мне 3 и nil, так что действительно есть 3 элемента в моем массиве, но они ноль, и я не понимаю, почему. У меня есть другой класс, который сохраняет String вместо Bottle, и у него нет функции init, такой как init(id: String, title: String, year: Int, icon: UIImage), и он отлично работает.

Вот как я сохранить бутылки:

var bottleLoaded = Bottle.loadSaved()! 
var bottleToSave = Bottle(id: bottleID, title: bottleName, year: bottleYear, icon: UIImage(data:bottleIconData)!) 
bottleLoaded.saveBottle(bottleToSave)  

и это все.

У меня также есть в предыдущем ViewController следующий код для того, чтобы «инициализировать» память

let bottleList = Bottle() 
bottleList.save()  

я уже пытался добавить NSUserDefaults.standardUserDefaults().synchronize() но это ничего не меняет, мои загруженные объекты все еще ноль ,

ответ

3

Вы должны сохранять и извлекать все атрибуты Bottle в NSCoding методов:

required init(coder aDecoder: NSCoder) { 
    self.bottlesArray = aDecoder.decodeObjectForKey("bottleArray") as NSMutableArray 
    self.id = aDecoder.decodeObjectForKey("id") as String 
    //etc. same for title, year, and icon (use decodeIntegerForKey: for year) 
} 

func encodeWithCoder(aCoder: NSCoder) { 
    aCoder.encodeObject(bottlesArray, forKey: "bottleArray") 
    aCoder.encodeObject(self.id, forKey: "id") 
    //etc. same for title, year, and icon (use encodeInteger:forKey: for year) 
} 
+0

Спасибо! Он отлично работает! – magohamoth

+0

Perfect: D +1 Tks. :) –

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

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