2016-07-21 4 views
0

私はこの奇妙な問題があります。 NSUserDefaultsにカスタムクラスオブジェクトを保存していますが、データを取得している間にオブジェクトの変数intnilになります。以下は、カスタムクラスiOS:カスタムオブジェクトのint変数がNSUserDefaultsでnilを返します

class User { 
    var name: String? 
    var user_id: Int? 
    var account_id: Int? 
    var location: String? 
} 
私はのようにオブジェクトを保存してい

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

などのデータを取得する、

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

私はこの現象の理由について全く見当がつかないです。

+1

をあなたのクラスは 'あなたがあなた自身を記述する必要がありNSCoding' – dan

+1

'に準拠する必要がありますアーカイバ '。 http://stackoverflow.com/questions/2315948/how-to-store-custom-objects-in-nsuserdefaults – Putz1103

+0

@ Putz1103私は既にその解決策を見てきましたが、あなたがここでそれを指摘するまで試してみませんでした。それは働いている。ありがとう! –

答えて

2

プロパティリスト項目を持たないカスタムクラスは、NSUserDefaultsに保存できるようにNSCodingに準拠する必要があります。ここで

はNSCodingに準拠するためのガイドです:http://nshipster.com/nscoding/

あなたは、これらの機能の両方が必要になります。

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

} 
関連する問題