Guarde objetos personalizados en NSUserDefaults

Tengo un ViewController noticias y un TeamViewController . TeamViewController contiene un tableView de teamObjects que cuando se selecciona se agrega a la matriz. Quiero agregar esta matriz a NSUserDefaults para que pueda acceder a ellos desde el NewsController que contiene una solicitud de URL donde se necesita teamObjects. Sin embargo sigo recibiendo:

‘Intento de insertar un objeto de lista no propiedad (‘ ‘) para equipos clave’

Estoy abierto a otras sugerencias si hay mejores formas 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 objeto

 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, tendrá que archivar el objeto personalizado en NSData , guardarlo en los valores predeterminados del usuario y recuperarlo de los valores predeterminados del usuario y desarchivarlo de nuevo. Puedes archivarlo así

 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 desarchivarlo como este

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

Pero si lo haces, obtendrás

 .Team encodeWithCoder:]: unrecognized selector sent to instance 

Tendrás que hacer que Team se ajuste a NSCoding 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 } 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") } } 

Puedes probar NSKeyedUnarchiver , como a continuación

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

  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 puedas ocultar esto en Swift

Espero que esto resuelva tu problema