Как сохранить NSMutablearray в NSUserDefaults

У меня два NSMutableArray . Они состоят из изображений или текста. Массивы отображаются через UITableView . Когда я убиваю приложение, данные в UITableView теряются. Как сохранить массив в UITableView с помощью NSUserDefault ?

Примечание. NSUserDefaults всегда будет возвращать неизменяемую версию объекта, в который вы проходите.

Чтобы сохранить информацию:

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

Чтобы получить информацию:

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

При первой загрузке проверьте, является ли результат, возвращающийся из NSUserDefaults , nil , если это необходимо, вам нужно создать свои данные, иначе загрузите данные из NSUserDefaults и ваш UITableView будет поддерживать состояние.

Обновить

В Swift-3 можно использовать следующий подход:

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

Вы можете сохранить свой изменяемый массив следующим образом:

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

Позже вы получите измененный массив от пользовательских значений по умолчанию. Важно, чтобы вы получили измененную копию, если хотите изменить массив позже.

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

Затем вы просто устанавливаете данные UITableview из вашего изменяемого массива через делегат UITableView

Надеюсь это поможет!

Я хочу просто добавить к другим ответам, что объект, который вы собираетесь хранить в хранилище в NSUserDefault , как указано в документации Apple, должен соответствовать следующему:

«Параметр value может быть только объектами списка свойств: NSData , NSString , NSNumber , NSDate, NSArray или NSDictionary. Для объектов NSArray и NSDictionary их содержимое должно быть объектами списка свойств."

здесь ссылка на руководство по спискам свойств

поэтому обратите внимание на то, что находится внутри вашего массива

Сохранить:

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

Получить:

 if let PickedArray = NSUserDefaults.standardUserDefaults().stringForKey("myArray") { print("SUCCCESS:") println(PickedArray) } выполнение if let PickedArray = NSUserDefaults.standardUserDefaults().stringForKey("myArray") { print("SUCCCESS:") println(PickedArray) } 

Вы действительно хотите хранить изображения в списке свойств? Вы можете сохранять изображения в файлы и сохранять имя файла как значение в NSDictionary .

определить путь для файлов хранилища

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

Хранить и загружать изображение:

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

И вы можете хранить путь или индексы в 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; } 

В NSUserDefaults вы можете хранить только NSUserDefaults объекты, такие как NSString , NSDictionary , NSNumber , NSArray .

Также вы можете сериализовать объекты с помощью NSKeyedArchiver/NSKeyedUnarchiver которые соответствуют протоколу NSCoding.

Если вам нужно добавить строки в NSMutableArray в определенном порядке, или если вы используете NSMutableArray для UITableView вы можете использовать это вместо этого:

 [NSMutableArray insertObject:string atIndex:0]; 

В Swift 3 для NSMutableArray вам нужно будет закодировать / декодировать массив, чтобы иметь возможность сохранять / извлекать его в NSUserDefaults:

экономия

 //Encoding array let encodedArray : NSData = NSKeyedArchiver.archivedData(withRootObject: myMutableArray) as NSData //Saving let defaults = UserDefaults.standard defaults.setValue(encodedArray, forKey:"myKey") defaults.synchronize() 

Получение

 //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] } 

Удаление

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

Быстрая версия:

Сохранить массив в NSUserDefaults:

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

Получить массив Bool из NSUserDefaults:

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

Получить массив строк из NSUserDefaults:

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

Сохраните информацию о массиве в NSUserdefaults с помощью ключа.

«MutableArray получил ответ JSON»

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

«Получить эту информацию (массив) в любом месте проекта с помощью того же ключа"

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

Это помогло мне в моем проекте и надеюсь, что это поможет кому-то.

  • Память постоянно увеличивается, чем при сбое приложения, когда я показываю изображение из каталога документа во время прокрутки UITableview
  • индексирование с использованием sectionIndexTitlesForTableView при наличии нескольких разделов
  • Возможно ли увеличить толщину разделительной линии UITableView?
  • iOS10 - ContentView блокирует привязки UIButton в заголовке UITableView
  • установите / снимите флажок, нажав на ячейку в виде таблицы и узнайте, какая ячейка проверена или снята флажка
  • Индекс массива за пределами диапазона при обновлении
  • Передать элемент массива ячеек в другой контроллер представления
  • Неверное значение из UITableView: rowHeight на iOS8
  • Как наследовать XIB-файл в проекте iOS?
  • Как работает dequeueReusableCellWithIdentifier: работа?
  • UITableView отскакивает с оценкой RowHeight
  • Interesting Posts

    iOS Google SignIn просматривает отсутствующую навигационную панель и нижнюю панель

    Как загрузить данные в ViewController из локального файла JSON

    Заполнение ячеек таблицы JSON с помощью Alamofire (Swift 2)

    CoreData обнаруживает удаленный объект после сохранения

    Позиционная метка на CPTBarPlot (Core-Plot)

    Ярлыки в представлении предупреждения запроса доступа ALAssetsLibrary не распознаются KIF

    iOS UITableView numberOfRowsInSection BAD ACCESS

    Структура фотографий: подключение к активам было прервано или активы умерли

    Как установить XCTest для запуска на устройстве

    iOS – UIBarButtonItem – Вертикальное положение заголовка кнопки Back Button не регулируется

    Facebook iOS SDK v4.0, получить список друзей

    Калибровка и масштабирование SKSpriteNode

    Как я могу пропустить диалог разрешений для одного входа iOS для Facebook?

    Выполните push-сегу после разматывания

    Как определить состояние воспроизведения звука в UIWebView в iOS?

    Давайте будем гением компьютера.