如何在NSUserDefaults中保存NSMutablearray

67

我有两个NSMutableArray,它们包含图像或文本。这些数组通过UITableView显示。当我杀掉应用程序时,UITableView中的数据会丢失。如何使用NSUserDefault保存UITableView中的数组?

9个回答

117

注意: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")

5
您的问题是如何在NSUserDefaults中存储数组。 - Tim
"NSUserDefaults在我的情况下将始终返回不可变版本。非常感谢!" - Pahnev
2
Swift 3 不需要执行 synchronize - Viktor

45

您可以这样保存可变数组:

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

之后,您从用户默认设置中获取可变的数组。如果您以后要编辑该数组,则获取可变副本非常重要。

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

然后,您只需通过UITableView委托将可变数组中的数据设置为UITableview数据。

希望这可以帮助您!


你只需声明两个不同的可变数组,并将它们保存为用户默认设置中的不同键。 - Philipp Otto
如果我使用这段代码,数组不会加载到UITableview中。在nslog中显示null值。 - user2841148
正如我所写的,你将通过ui table view delegate设置ui table view的数据。阅读这个:http://tech.pro/tutorial/1026/how-to-create-and-populate-a-uitableview - Philipp Otto
谢谢,你是救星。最后的 "mutableCopy" 非常重要。否则,即使将数据存回 NSMutableArray 中,内容仍然是不可变的。非常感谢 :) - Supertecnoboff
1
注意:每次设置NSUserDefault时都不需要调用synchronize - shim

7
我想补充其他答案,你要存储在NSUserDefault中的对象必须符合苹果文档所述的要求。该值参数只能是属性列表对象: NSData, NSString, NSNumber, NSDate, NSArray或NSDictionary。对于NSArray和NSDictionary对象,它们的内容必须是属性列表对象。请参考属性列表编程指南。因此,请注意数组中的内容。

3

您真的想将图像存储在属性列表中吗?您可以将图像保存到文件中,并将文件名作为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中,你只能存储简单的对象,比如NSStringNSDictionaryNSNumberNSArray

此外,你还可以使用符合NSCoding协议的NSKeyedArchiver/NSKeyedUnarchiver来序列化对象。


3

保存:

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

检索:

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

2

如果你需要按照特定顺序向NSMutableArray中添加字符串,或者如果你在为UITableView使用NSMutableArray,那么你可能会想要使用以下方式:

[NSMutableArray insertObject:string atIndex:0];

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

}

2

使用键在NSUserdefaults中保存数组信息。

"从JSON响应中接收到的MutableArray"

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

"使用相同的键在项目中的任何位置检索此信息(数组)"
NSArray *arrayList = [[NSUserDefaults standardUserDefaults] valueForKey:@"arrayListing"];

这对我的项目有所帮助,希望它能帮助到其他人。


1

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]()
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接