ios - Cómo guardar NSMutablearray en NSUserDefaults
objective-c uitableview (9)
Tengo dos NSMutableArray
. Consisten en imágenes o texto. Las matrices se muestran a través de UITableView
. Cuando UITableView
la aplicación, los datos dentro de UITableView
se pierden. ¿Cómo guardar una matriz en UITableView
usando NSUserDefault
?
¿Realmente quieres almacenar imágenes en la lista de propiedades? Puede guardar imágenes en archivos y almacenar el nombre del archivo como valor en NSDictionary
.
definir ruta para archivos de tienda
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
self.basePath = [paths firstObject];
Almacenar y cargar imagen:
- (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]];
}
Y puede almacenar ruta o índices en 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;
}
En NSUserDefaults
solo puede almacenar objetos como NSString
, NSDictionary
, NSNumber
, NSArray
.
También puede serializar objetos con NSKeyedArchiver/NSKeyedUnarchiver
que se ajuste al protocolo NSCoding.
En Swift 3, para un NSMutableArray, necesitará codificar / decodificar su matriz para poder guardarla / recuperarla en NSUserDefaults:
Ahorro
//Encoding array
let encodedArray : NSData = NSKeyedArchiver.archivedData(withRootObject: myMutableArray) as NSData
//Saving
let defaults = UserDefaults.standard
defaults.setValue(encodedArray, forKey:"myKey")
defaults.synchronize()
Recuperando
//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]
}
Eliminando
//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")
}
Guarde la información de Array en NSUserdefaults con la clave.
"MutableArray recibió de la respuesta JSON"
[[NSUserDefaults standardUserDefaults] setObject:statuses forKey:@"arrayListing"];
"Recupere esta información (Array) en cualquier lugar del proyecto con la misma clave"
NSArray *arrayList = [[NSUserDefaults standardUserDefaults] valueForKey:@"arrayListing"];
Esto me ayudó en mi proyecto y espero que ayude a alguien.
Nota: NSUserDefaults siempre devolverá una versión inmutable del objeto que pase.
Para almacenar la información:
// 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];
Para recuperar la información:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *arrayOfImages = [userDefaults objectForKey:@"tableViewDataImage"];
NSArray *arrayOfText = [userDefaults objectForKey:@"tableViewDataText"];
// Use ''yourArray'' to repopulate your UITableView
En la primera carga, compruebe si el resultado que devuelve NSUserDefaults
es nil
, si es así, necesita crear sus datos; de lo contrario, cargue los datos de NSUserDefaults
y su UITableView
mantendrá el estado.
Actualizar
En Swift-3, se puede usar el siguiente enfoque:
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")
Puede guardar su matriz mutable de la siguiente manera:
[[NSUserDefaults standardUserDefaults] setObject:yourArray forKey:@"YourKey"];
[[NSUserDefaults standardUserDefaults] synchronize];
Más tarde, recuperará la matriz mutable de los valores predeterminados del usuario. Es importante que obtenga la copia mutable si desea editar la matriz más adelante.
NSMutableArray *yourArray = [[[NSUserDefaults standardUserDefaults] arrayForKey:@"YourKey"] mutableCopy];
Luego simplemente configura los datos de UITableview
de su matriz mutable a través del delegado UITableView
¡Espero que esto ayude!
Si necesita agregar cadenas a NSMutableArray
en un orden específico específico, o si está utilizando NSMutableArray
para una UITableView
, puede usar esto en su lugar:
[NSMutableArray insertObject:string atIndex:0];
Solo quiero agregar a las otras respuestas que el objeto que va a almacenar almacenar en el NSUserDefault
, como se informa en la documentación de Apple debe ser conforme a esto:
"El parámetro del valor puede ser solo objetos de la lista de propiedades: NSData
, NSString
, NSNumber
, NSDate, NSArray o NSDictionary. Para los objetos NSArray y NSDictionary, sus contenidos deben ser objetos de la lista de propiedades".
aquí el enlace a la guía de programación de la lista de propiedades
así que presta atención sobre lo que hay dentro de tu matriz
Versión Swift:
Guardar matriz en NSUserDefaults:
NSUserDefaults.standardUserDefaults().setObject(selection, forKey: "genderFiltersSelection")
Recuperar Arol Array de NSUserDefaults:
if NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") != nil{
selection = NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") as? [Bool] ?? [Bool]()
}
Recuperar matriz de matriz de NSUserDefaults:
if NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") != nil{
selection = NSUserDefaults.standardUserDefaults().objectForKey("genderFiltersSelection") as? [String] ?? [String]()
}
Salvar:
NSUserDefaults.standardUserDefaults().setObject(PickedArray, forKey: "myArray")
NSUserDefaults.standardUserDefaults().synchronize()
Recuperar:
if let PickedArray = NSUserDefaults.standardUserDefaults().stringForKey("myArray") {
print("SUCCCESS:")
println(PickedArray)
}