J'ai une nouvelle ViewController
et une TeamViewController
. Le TeamViewController
contient une tableView de teamObjects qui, lorsqu'elle est sélectionnée, est ajoutée au tableau. Je veux ajouter ce tableau dans NSUserDefaults
afin que je puisse y accéder à partir de NewsController
qui contient une demande d'URL dans laquelle le paramètre teamObjects est requis. Cependant je continue à recevoir:
'Tentative d'insertion d'un objet de liste non propriété ("") pour les équipes clés "
Je suis ouvert à d’autres suggestions s’il existe de meilleurs moyens que de les stocker dans NSUserDefaults
didSelectRowAtIndexPath
méthode
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()
}
Mon objet
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
}
}
En fait, vous devrez archiver l'objet personnalisé dans NSData
, puis enregistrez-le dans les paramètres par défaut de l'utilisateur, puis récupérez-le à partir des paramètres par défaut et désarchivez-le à nouveau. Vous pouvez l'archiver comme ça
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()
et le désarchiver comme ça
let decoded = userDefaults.data(forKey: "teams")
let decodedTeams = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Team]
Mais si vous venez de le faire, vous obtiendrez
.Team encodeWithCoder:]: unrecognized selector sent to instance
Vous devrez rendre votre équipe conforme à NSCoding comme ceci
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")
}
}
Vous pouvez essayer NSKeyedUnarchiver, comme ci-dessous
Ici j'ai stocké UIColor Object dans UserDefault Vous pouvez le changer avec votre objet
NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color];
[[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"myColor"];
et de se rétracter
NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"];
UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];
Note: Ceci est l'Objectif C mais j'espère que vous pourrez convertir ceci en Swift
J'espère que cela résoudra votre problème