【问题标题】:iOS: Custom object's int variable returns nil in NSUserDefaultsiOS:自定义对象的 int 变量在 NSUserDefaults 中返回 nil
【发布时间】:2016-07-21 20:29:18
【问题描述】:

我有这个奇怪的问题。我将自定义类对象保存在NSUserDefaults 中,并在检索数据时为对象的int 变量获得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)
    }
}

我完全不知道这种行为的原因。

【问题讨论】:

  • 你的类需要符合NSCoding
  • 您可能需要编写自己的Archiverstackoverflow.com/questions/2315948/…
  • @Putz1103 我已经看到了那个解决方案,但是直到你在这里指出它才尝试。它正在工作。谢谢!

标签: ios swift nsuserdefaults custom-object


【解决方案1】:

没有属性列表项的自定义类需要符合 NSCoding 才能保存在 NSUserDefaults 中。

这是符合 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")

}

【讨论】:

    猜你喜欢
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多