Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Примечание. 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")

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Сохранить

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

Загрузить:

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

Ответ 5

Вы действительно хотите хранить изображения в списке свойств? Вы можете сохранять изображения в файлах и сохранять имя файла как значение в 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 вы можете хранить только простые объекты, такие как NSString, NSDictionary, NSNumber, NSArray.

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

Ответ 6

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

[NSMutableArray insertObject:string atIndex:0];

Ответ 7

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

}

Ответ 8

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

"MutableArray получен из ответа JSON"

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

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

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

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

Ответ 9

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

Сохранить массив в 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]()
    }