63

我有两个NSMutableArray。它们由图像或文本组成。数组通过UITableView. 当我杀死应用程序时,其中的数据UITableView会丢失。如何使用保存UITableView数组NSUserDefault

4

9 回答 9

114

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

首次加载时,检查返回的结果是否NSUserDefaultsnil,如果是,则需要创建数据,否则加载数据NSUserDefaultsUITableView保持状态。

更新

在 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")
于 2013-10-28T12:12:47.447 回答
46

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

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

稍后您从用户默认值中获取可变数组。如果您想稍后编辑数组,获取可变副本很重要。

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

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

希望这可以帮助!

于 2013-10-28T12:15:26.003 回答
7

我只想添加其他答案,即您要存储的对象存储在NSUserDefaultApple 文档中,如 Apple 文档中所述,必须符合以下要求:

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

这里是属性列表编程指南的链接

所以要注意你的数组里面有什么

于 2013-10-28T13:18:32.120 回答
3

节省:

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

取回:

if let PickedArray = NSUserDefaults.standardUserDefaults().stringForKey("myArray") {
    print("SUCCCESS:")
    println(PickedArray)
}
于 2015-09-16T05:39:36.780 回答
2

您真的要将图像存储在属性列表中吗?您可以将图像保存到文件中并将文件名存储为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 协议的对象。

于 2015-06-26T12:39:02.990 回答
2

如果您需要将字符串添加到NSMutableArrayin ant 特定的顺序,或者如果您正在使用NSMutableArrayfor aUITableView您可能希望使用它来代替:

[NSMutableArray insertObject:string atIndex:0];
于 2015-07-11T01:50:47.847 回答
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")

}
于 2016-12-22T17:19:20.837 回答
2

NSUserdefaults用 key保存 Array 的信息。

“从 JSON 响应收到的 MutableArray”

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

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

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

这在我的项目中帮助了我,并希望它会对某人有所帮助。

于 2017-04-06T13:12:41.260 回答
1

斯威夫特版本:

在 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]()
    }
于 2016-11-09T10:55:10.620 回答