Cómo guardar NSMutablearray en NSUserDefaults

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 ?

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!

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 progtwigción de la lista de propiedades

así que presta atención sobre lo que hay dentro de tu matriz

Salvar:

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

Recuperar:

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

¿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.

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]; 

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

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

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.