ios objective-c uitableview nsmutablearray nsuserdefaults

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) }