2016-07-21 14 views
0

Ich habe dieses seltsame Problem. Ich speichere benutzerdefinierte Klassenobjekt in NSUserDefaults, und beim Abrufen der Daten erhalte ich nil für int Variable des Objekts. Unten ist die benutzerdefinierte KlasseiOS: Die int-Variable des benutzerdefinierten Objekts gibt in NSUserDefaults null zurück

class User { 
    var name: String? 
    var user_id: Int? 
    var account_id: Int? 
    var location: String? 
} 

ich als das Objekt bin Speichern

let defaults = NSUserDefaults.standardUserDefaults() 
var data = NSKeyedArchiver.archivedDataWithRootObject([user]) // I can see the int values for the user objects here 
defaults.setObject(data, forKey: "all_users") 

Abrufen der Daten als,

let defaults = NSUserDefaults.standardUserDefaults() 

let data = defaults.dataForKey("all_users") 
var users = [Users]() 
if data != nil { 
    let userData = NSKeyedUnarchiver.unarchiveObjectWithData(data!) as! [Users] 

    for usr in userData { 
     print("\(usr.name!)") // Prints the name 
     print("\(usr.user_id!)") // Nil value here 
     users.append(usr) 
    } 
} 

Ich habe absolut keine Ahnung von den Grund für dieses Verhalten .

+1

Ihre Klasse 'NSCoding' entsprechen muss – dan

+1

Möglicherweise müssen Sie Ihre eigene schreiben' Archiver ". http://stackoverflow.com/questions/2315948/how-to-store-custom-objects-in-nsuserdefaults – Putz1103

+0

@ Putz1103 Ich habe diese Lösung schon gesehen aber nicht versucht, bis Sie darauf hingewiesen haben. Es funktioniert. Vielen Dank! –

Antwort

2

Benutzerdefinierte Klassen, die keine Eigenschaftenlistenelemente aufweisen, müssen NSCoding entsprechen, damit sie in NSUserDefaults gespeichert werden können. Hier

ist ein Leitfaden zur konform NSCoding: http://nshipster.com/nscoding/

Sie werden beide Funktionen benötigen:

init(coder decoder: NSCoder) { 
    self.name = decoder.decodeObjectForKey("name") as String 
    self.user_id = decoder.decodeIntegerForKey("user_id") 
    self.account_id = decoder.decodeIntegerForKey("account_id") 
    self.location = decoder.decodeObjectForKey("self.location") as String 

} 

func encodeWithCoder(coder: NSCoder) { 
    coder.encodeObject(self.name, forKey: "name") 
    coder.encodeInt(self.user_id, forKey: "user_id") 
    coder.encodeInt(account_id, forKey: "account_id") 
    coder.encodeObject(self.location, forKey: "location") 

}