Как сохранить NSMutablearray в NSUserDefaults
у меня есть два NSMutableArray
. Они состоят из изображений или текста.
Массивы отображаются через UITableView
.
Когда я убиваю приложение, данные в UITableView
теряется.
Как сохранить массив в UITableView
С помощью NSUserDefault
?
9 ответов
Примечание: 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
is 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)
}
вы действительно хотите хранить изображения в списке свойств? Вы можете сохранить изображения в файлы и сохранить имя файла как значение в 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 .
Если вам нужно добавить строки NSMutableArray
в определенном порядке ant, или если вы используете 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")
}
Swift Версия:
сохранить массив в 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"];
это помогло мне в моем проекте и надеюсь, это поможет кому-то.