web-dev-qa-db-fra.com

Enregistrer des objets personnalisés dans NSUserDefaults

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

    }

}
63
Peter Pik

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")
    }
}
213
mohamede1945

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

1
Malav Soni