web-dev-qa-db-fra.com

Comment enregistrer NSMutablearray dans NSUserDefaults

J'ai deux NSMutableArray. Ils sont constitués d'images ou de texte. Les tableaux sont affichés via un UITableView. Lorsque je tue l'application, les données contenues dans UITableView sont perdues. Comment enregistrer un tableau dans UITableView en utilisant NSUserDefault?

60
user2841148

Remarque: NSUserDefaults renverra toujours une version immuable de l'objet que vous transmettez.

Pour stocker les informations:

// Get the standardUserDefaults object, store your UITableView data array against a key, synchronize the defaults
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:arrayOfImage forKey:@"tableViewDataImage"];
[userDefaults setObject:arrayOfText forKey:@"tableViewDataText"];
[userDefaults synchronize];

Pour récupérer les informations:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *arrayOfImages = [userDefaults objectForKey:@"tableViewDataImage"];
NSArray *arrayOfText = [userDefaults objectForKey:@"tableViewDataText"];
// Use 'yourArray' to repopulate your UITableView

Au premier chargement, vérifiez si le résultat renvoyé par NSUserDefaults est nil, si c'est le cas, vous devez créer vos données, sinon chargez les données de NSUserDefaults et votre UITableView maintiendra l'état.

Mise à jour

Dans Swift-3, l'approche suivante peut être utilisée:

let userDefaults = UserDefaults.standard

userDefaults.set(arrayOfImage, forKey:"tableViewDataImage")
userDefaults.set(arrayOfText, forKey:"tableViewDataText")
userDefaults.synchronize()

var arrayOfImages = userDefaults.object(forKey: "tableViewDataImage")
var arrayOfText = userDefaults.object(forKey: "tableViewDataText")
112
Tim

Vous pouvez enregistrer votre tableau mutable comme ceci:

[[NSUserDefaults standardUserDefaults] setObject:yourArray forKey:@"YourKey"];
[[NSUserDefaults standardUserDefaults] synchronize];

Plus tard, vous récupérez le tableau mutable des valeurs par défaut de l'utilisateur. Il est important que vous obteniez la copie mutable si vous souhaitez éditer le tableau ultérieurement.

NSMutableArray *yourArray = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"YourKey"] mutableCopy];

Ensuite, vous définissez simplement les données UITableview de votre tableau mutable via le délégué UITableView

J'espère que cela t'aides!

44
Philipp Otto

Je souhaite simplement ajouter aux autres réponses que l'objet que vous allez stocker stocke dans NSUserDefault, comme indiqué dans Apple doit être conforme à ceci:

"Le paramètre value ne peut être que des objets de liste de propriétés: NSData, NSString, NSNumber, NSDate, NSArray ou NSDictionary. Pour les objets NSArray et NSDictionary, leur contenu doit être propriété liste des objets. "

voici le lien vers guide de programmation de la liste de propriétés

alors faites attention à ce qui est à l'intérieur de votre tableau

7
Manu

Enregistrer:

NSUserDefaults.standardUserDefaults().setObject(PickedArray, forKey: "myArray")
 NSUserDefaults.standardUserDefaults().synchronize()

Récupérer:

if let PickedArray = NSUserDefaults.standardUserDefaults().stringForKey("myArray") {
    print("SUCCCESS:")
    println(PickedArray)
}
3
A.G

Si vous devez ajouter des chaînes à la commande NSMutableArray dans un ordre spécifique ou si vous utilisez la commande NSMutableArray pour un UITableView, vous souhaiterez peut-être utiliser ceci à la place:

[NSMutableArray insertObject:string atIndex:0];
2
Lance

Voulez-vous vraiment stocker les images dans la liste des propriétés? Vous pouvez enregistrer des images dans des fichiers et stocker le nom de fichier en tant que valeur dans NSDictionary.

définir le chemin pour les fichiers de magasin


NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
self.basePath = [paths firstObject];

Stocker et charger l'image:


- (NSString *)imageWithKey:(NSString)key {
    NSString *fileName = [NSString stringWithFormat:@"%@.png", key]
    return [self.basePath stringByAppendingPathComponent:fileName];
}

- (void)saveImage:(UIImage *)image withKey:(NSString)key {
    NSData *imageData = UIImagePNGRepresentation(image);
    [imageData writeToFile:[self imageWithKey:key] atomically:YES];
}

- (UIImage *)loadImageWithKey:(NSString)key { {
    return [UIImage imageWithContentsOfFile:[self imageWithKey:key]];
}

Et vous pouvez stocker le chemin ou les index dans NSMutableDictionary


- (void)saveDictionary:(NSDictionary *)dictionary {
    NSMutableDictionary *dictForSave = [@{ } mutableCopy];
    for (NSString *key in [dictionary allKeys]) {
        [self saveImageWithKey:key];
        dictForSave[key] = @{ @"image" : key };
    }
    [[NSUserDefaults standardUserDefaults] setObject:dictForSave forKey:@"MyDict"];
}

- (NSMutableDictionary *)loadDictionary:(NSDictionary *)dictionary {
    NSDictionary *loadedDict = [[NSUserDefaults standardUserDefaults] objectForKey:@"MyDict"];
    NSMutableDictionary *result = [@{ } mutableCopy];
    for (NSString *key in [loadedDict allKeys]) {
        result[key] = [self imageWithKey:key];
    }
    return result;
}

Dans NSUserDefaults, vous ne pouvez stocker que de simples objets tels que NSString, NSDictionary, NSNumber, NSArray.

Vous pouvez aussi sérialiser des objets avec NSKeyedArchiver/NSKeyedUnarchiver conforme au protocole NSCoding.

2
aironik

Dans Swift 3, pour un NSMutableArray, vous devrez encoder/décoder votre tableau pour pouvoir le sauvegarder/le récupérer dans NSUserDefaults:

Sauvegarde

//Encoding array
let encodedArray : NSData = NSKeyedArchiver.archivedData(withRootObject: myMutableArray) as NSData

//Saving
let defaults = UserDefaults.standard
defaults.setValue(encodedArray, forKey:"myKey")
defaults.synchronize()

Récupération

//Getting user defaults
let defaults = UserDefaults.standard

//Checking if the data exists
if defaults.data(forKey: "myKey") != nil {
   //Getting Encoded Array
   let encodedArray = defaults.data(forKey: "myKey")

   //Decoding the Array
   let decodedArray = NSKeyedUnarchiver.unarchiveObject(with: encodedArray!) as! [String]
}

Retrait

//Getting user defaults
let defaults = UserDefaults.standard

//Checking if the data exists
if defaults.data(forKey: "myKey") != nil {

    //Removing the Data
    defaults.removeObject(forKey: "myKey")

}
2
Ugo Marinelli

Enregistrez les informations de tableau dans NSUserdefaults avec la clé.

"MutableArray a reçu une réponse JSON"

[[NSUserDefaults standardUserDefaults] setObject:statuses forKey:@"arrayListing"];

"Récupérer cette information (Array) n'importe où dans le projet avec la même clé"

NSArray *arrayList = [[NSUserDefaults standardUserDefaults] valueForKey:@"arrayListing"];

Cela m'a aidé dans mon projet et j'espère que cela aidera quelqu'un.

2
Dilip Tiwari

Version rapide:

Enregistrer le tableau dans NSUserDefaults:

NSUserDefaults.standardUserDefaults().setObject(selection, forKey: "genderFiltersSelection")

Récupérer un tableau de booléens à partir de NSUserDefaults:

if NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") != nil{
                selection = NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") as? [Bool] ?? [Bool]()
   }

Récupérer un tableau de chaînes à partir de NSUserDefaults:

if NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") != nil{
                selection = NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") as? [String] ?? [String]()
    }
1
Mughees