如何在NSUserDefaults中保存NSMutablearray

我有两个NSMutableArray的。 它们由图像或文字组成。 数组通过UITableView显示。 当我杀了应用程序的UITableView内的数据会丢失。 如何使用NSUserDefaultUITableView保存数组?

注意: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 ,如果是,则需要创build数据,否则从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 ,正如苹果文档中所报告必须符合这一点:

“值参数只能是属性列表对象: NSDataNSStringNSNumber ,NSDate,NSArray或NSDictionary。对于NSArray和NSDictionary对象,它们的内容必须是属性列表对象。

这里链接到房产列表编程指南

所以要注意你arrays里面的东西

保存:

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

检索:

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

你真的想要将图像存储在属性列表中吗? 您可以将图像保存到文件中,并将文件名保存为NSDictionary值。

定义商店文件的path

 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存储path或索引

 - (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您只能存储简单的对象,如NSStringNSDictionaryNSNumberNSArray

您也可以使用符合NSCoding协议的NSKeyedArchiver/NSKeyedUnarchiver序列化对象。

如果你需要以ant特定的顺序向NSMutableArray添加string,或者如果你正在使用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") 

从NSUserDefaults检索布尔数组:

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

从NSUserDefaults中检索string数组:

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

将密钥的信息保存到NSUserdefaults中。

“从JSON响应收到的MutableArray”

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

“使用相同的密钥在项目中的任何位置检索此信息(数组)

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

这帮助了我的项目,希望能帮助到别人。