如何在NSUserDefaults中保存NSMutablearray
我有两个NSMutableArray
的。 它们由图像或文字组成。 数组通过UITableView
显示。 当我杀了应用程序的UITableView
内的数据会丢失。 如何使用NSUserDefault
在UITableView
保存数组?
注意: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
,正如苹果文档中所报告必须符合这一点:
“值参数只能是属性列表对象: NSData
, NSString
, NSNumber
,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
您只能存储简单的对象,如NSString
, NSDictionary
, NSNumber
, NSArray
。
您也可以使用符合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"];
这帮助了我的项目,希望能帮助到别人。