2013-10-28 5 views
52

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

ответ

105

Примечания: 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 

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

Update

В Свифта-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") 
+0

У меня есть два массива ArrayOfImage и ArrayOfText. Как объявить это. – user2841148

+0

Точно так же, просто сделайте это дважды с разными ключами. – Tim

+0

Я обновил свой ответ – Tim

40

Вы можете сохранить изменяемый массив как это:

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

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

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

Тогда вы просто установить UITableview данные с изменяемым массива с помощью UITableView делегата

Надежда это помогает!

+0

У меня есть два массива ArrayOfImage и ArrayOfText. Как объявить это. – user2841148

+0

Вы просто объявляете 2 разных изменяемых массива и сохраняете их для разных ключей в настройках по умолчанию. –

+0

Если я использую этот код, массивы не загружаются в UITableview. он показывает значение null в nslog – user2841148

7

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

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

здесь ссылка на property list programming guide

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

2

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

2

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

[NSMutableArray insertObject:string atIndex:0]; 
3

Сохранить:

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

Получить:

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

Swift Версия:

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

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

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

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

Retrieve массив строк из NSUserDefaults:

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

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

} 
1

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

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

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

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

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

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

Смежные вопросы