Guardar objects personalizados en NSUserDefaults

Tengo una noticia ViewController y un TeamViewController . El TeamViewController contiene una tableView de teamObjects que cuando se selecciona se agrega a la matriz. Quiero agregar esta matriz en NSUserDefaults para que pueda acceder a ellos desde NewsController que contienen una request url donde se necesitan los teamObjects. Sin embargo, sigo recibiendo:

'Intento de insert object de list no propiedad ("") para equipos key

Estoy abierto a otras sugerencias si hay mejores forms de almacenarlo en NSUserDefaults

método 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() } 

Mi object

 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 realidad, necesitará archivar el object personalizado en NSData, luego guárdelo en los valores pnetworkingeterminados del usuario y recupérelo de los valores pnetworkingeterminados del usuario y desarchivelo nuevamente. Puedes archivarla de esta manera

 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() 

y desarchive como este

 let decoded = userDefaults.object(forKey: "teams") as! Data let decodedTeams = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Team] 

Pero si lo hiciste, obtendrás

 .Team encodeWithCoder:]: unrecognized selector sent to instance 

Tendrá que hacer que el equipo se ajuste a NSCoding tal como este

 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 } requinetworking 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") } } 

Puedes probar NSKeyedUnarchiver , como a continuación.

Aquí almacené UIColor Object en UserDefault Puedes cambiarlo con tu object

  NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:color]; [[NSUserDefaults standardUserDefaults] setObject:colorData forKey:@"myColor"]; 

y para recuperar eso

 NSData *colorData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myColor"]; UIColor *color = [NSKeyedUnarchiver unarchiveObjectWithData:colorData]; 

Nota: Este es el Objetivo C, pero espero que pueda ocultar esto en Swift

Espero que esto resuelva tu problema