Сохранение пользовательских объектов в NSUserDefaults
У меня есть новости ViewController
и TeamViewController
. В TeamViewController
содержится tableView командных объектов, которые при выборе добавляются в массив. Я хочу добавить этот массив в NSUserDefaults
, чтобы я мог получить к ним доступ из NewsController
, в котором содержится запрос url, где необходимы команды teamObjects. Однако я продолжаю получать:
'Попытка вставить объект списка свойств ( "" ) для ключевых команд
Я открыт для других предложений, если есть лучшие способы, чем хранить его в 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
}
}
Ответы
Ответ 1
На самом деле вам нужно будет архивировать пользовательский объект в NSData
, а затем сохранить его по умолчанию пользователя и извлечь его из пользовательских значений по умолчанию и снова удалить его.
Вы можете архивировать его так:
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]
Но если вы только что это сделали, вы получите
.Team encodeWithCoder:]: unrecognized selector sent to instance
Вам нужно будет сделать команду совместимой с NSCoding так же, как это
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")
}
}
Ответ 2
Вы можете попробовать NSKeyedUnarchiver, например ниже
Здесь я сохранил объект UIColor в UserDefault. Вы можете изменить его с помощью своего объекта
NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color];
[[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"myColor"];
и вернуть этот
NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];
Примечание: это Objective C, но я надеюсь, что вы можете скрывать это в Swift
Надеюсь, что это решит вашу проблему.