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
?
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")
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!
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
Enregistrer:
NSUserDefaults.standardUserDefaults().setObject(PickedArray, forKey: "myArray")
NSUserDefaults.standardUserDefaults().synchronize()
Récupérer:
if let PickedArray = NSUserDefaults.standardUserDefaults().stringForKey("myArray") {
print("SUCCCESS:")
println(PickedArray)
}
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];
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.
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")
}
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.
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]()
}