【发布时间】:2013-11-07 04:53:00
【问题描述】:
我有两个NSMutableArray。它们由图像或文本组成。
数组通过UITableView 显示。
当我杀死应用程序时,UITableView 中的数据会丢失。
如何使用NSUserDefault将数组保存在UITableView中?
【问题讨论】:
标签: ios objective-c uitableview nsmutablearray nsuserdefaults
我有两个NSMutableArray。它们由图像或文本组成。
数组通过UITableView 显示。
当我杀死应用程序时,UITableView 中的数据会丢失。
如何使用NSUserDefault将数组保存在UITableView中?
【问题讨论】:
标签: ios objective-c uitableview nsmutablearray nsuserdefaults
注意: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")
【讨论】:
synchronize
你可以像这样保存你的可变数组:
[[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对象,它们的内容必须是属性列表对象。"
这里是property list programming guide的链接
所以要注意你的数组里面有什么
【讨论】:
保存:
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。
您还可以使用符合 NSCoding 协议的NSKeyedArchiver/NSKeyedUnarchiver 序列化对象。
【讨论】:
如果您需要以特定于 ant 的顺序将字符串添加到 NSMutableArray,或者如果您将 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")
}
【讨论】:
用key将Array的信息保存在NSUserdefaults中。
“从 JSON 响应收到的 MutableArray”
[[NSUserDefaults standardUserDefaults] setObject:statuses forKey:@"arrayListing"];
“在项目中的任何地方使用相同的键检索此信息(数组)”
NSArray *arrayList = [[NSUserDefaults standardUserDefaults] valueForKey:@"arrayListing"];
这对我的项目有帮助,希望对某人有所帮助。
【讨论】:
Swift 版本:
在 NSUserDefaults 中保存数组:
NSUserDefaults.standardUserDefaults().setObject(selection, forKey: "genderFiltersSelection")
从 NSUserDefaults 中检索 Bool 数组:
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]()
}
【讨论】: