将自定义对象保存到NSUserDefaults中 [英] Save custom objects into NSUserDefaults
问题描述
我有新闻 ViewController
和 TeamViewController
。 TeamViewController
包含teamObjects的tableView,选中后将其添加到数组中。我想将此数组添加到 NSUserDefaults
中,以便我可以从 NewsController
访问它们,其中包含url请求,其中包含teamObjects需要。但是我一直得到:
I'm having a news ViewController
and a TeamViewController
. The TeamViewController
contain a tableView of teamObjects which when selected is added into array. I want to add this array into NSUserDefaults
so i can access them from the NewsController
which contain a url request where the teamObjects is needed. However i keep getting:
'尝试为密钥插入非属性列表对象(
)团队'
'Attempt to insert non-property list object ( "" ) for key teams'
如果有更好的方法而不是将其存储在 NSUserDefaults中,我会对其他建议开放
I'm open for other suggestions if there is better ways than storing it in NSUserDefaults
didSelectRowAtIndexPath
方法
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
let team = self.teamArray[indexPath.row] as Team
var removed = false
for (index, value) in enumerate(self.teamSelected) {
if (value == team) {
self.teamSelected.removeAtIndex(index)
removed = true
}
}
if (!removed) {
self.teamSelected.append(team)
}
var userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setValue(self.teamSelected, forKey: "teams")
userDefaults.synchronize()
tableView.reloadData()
}
我的对象
class Team: NSObject{
var id: Int!
var name: NSString!
var shortname: NSString!
init(id: Int, name:NSString, shortname: NSString) {
self.id = id
self.name = name
self.shortname = shortname
}
}
推荐答案
实际上,您需要将自定义对象存档到 NSData
中,然后将其保存为用户默认值并从用户默认值中检索并取消归档再一次。
你可以像这样存档
Actually, you will need to archive the custom object into NSData
then save it to user defaults and retrieve it from user defaults and unarchive it again.
You can archive it like this
let teams = [Team(id: 1, name: "team1", shortname: "t1"), Team(id: 2, name: "team2", shortname: "t2")]
var userDefaults = UserDefaults.standard
let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: teams)
userDefaults.set(encodedData, forKey: "teams")
userDefaults.synchronize()
并将其解压缩如此
let decoded = userDefaults.object(forKey: "teams") as! Data
let decodedTeams = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Team]
但如果你刚刚那样做,你将获得
But if you just did that you will get
.Team encodeWithCoder:]: unrecognized selector sent to instance
你必须让Team符合NSCoding就像这样
You will have to make Team conform to NSCoding just like this
class Team: NSObject, NSCoding {
var id: Int
var name: String
var shortname: String
init(id: Int, name: String, shortname: String) {
self.id = id
self.name = name
self.shortname = shortname
}
required convenience init(coder aDecoder: NSCoder) {
let id = aDecoder.decodeInteger(forKey: "id")
let name = aDecoder.decodeObject(forKey: "name") as! String
let shortname = aDecoder.decodeObject(forKey: "shortname") as! String
self.init(id: id, name: name, shortname: shortname)
}
func encode(with aCoder: NSCoder) {
aCoder.encode(id, forKey: "id")
aCoder.encode(name, forKey: "name")
aCoder.encode(shortname, forKey: "shortname")
}
}
这篇关于将自定义对象保存到NSUserDefaults中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!