将自定义对象保存到 NSUserDefaults [英] Save custom objects into NSUserDefaults
问题描述
我有一个新闻 ViewController
和一个 TeamViewController
.TeamViewController
包含一个 teamObjects 的 tableView,当它被选中时被添加到数组中.我想将此数组添加到 NSUserDefaults
中,以便我可以从 NewsController
访问它们,其中包含需要 teamObjects 的 url 请求.但是我不断得到:
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
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.data(forKey: "teams")
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屋!