我想要救一个 NSMutableDictionary 对象 NSUserDefaults.关键的类型 NSMutableDictionaryNSString, ,值类型 NSArray, ,其中包含一系列的对象它实现 NSCoding.每文件, NSStringNSArray 两者都符合 NSCoding.

我得到这个错误:

[NSUserDefaults setObject:forKey:]:试图插入非财产。类NSCFDictionary.

有帮助吗?

解决方案

我发现了一个替代方案中,前保存,我使用编码NSArray根对象(NSKeyedArchiver对象),它与NSData结束。然后使用UserDefaults保存NSData

当我所需要的数据,我读出NSData,并使用NSKeyedUnarchiverNSData转换回该对象。

这是一个有点麻烦,因为我需要转换到/自NSData每次,但它只是工作。

下面是每个请求一个示例:

保存:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *arr = ... ; // set value
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr];
[defaults setObject:data forKey:@"theKey"];
[defaults synchronize];

负载:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:@"theKey"];
NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithData:data];

在阵列实现元件

@interface CommentItem : NSObject<NSCoding> {
    NSString *value;
}

然后,在CommentItem的实施,提供了两种方法:

-(void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeObject:value forKey:@"Value"];
}

-(id)initWithCoder:(NSCoder *)decoder
{
    self.value = [decoder decodeObjectForKey:@"Value"];
    return self;
}

任何人有更好的解决方案?

谢谢大家。

其他提示

如果您在保存用户默认,所有对象,递归对象,一路下来,必须属性列表对象。顺应NSCoding并不意味着什么,这里 - NSUserDefaults不会自动编码他们进入NSData,你必须自己做。如果你的“它实现NSCoding对象的名单”是指不属于财产清单对象的对象,那么你就必须保存到用户违约之前,做他们的东西。

FYI属性列表类NSDictionaryNSArrayNSStringNSDateNSData,和NSNumber。你可以写可变的子类(如NSMutableDictionary)用户的喜好,但是你读出的对象将永远是一成不变的。

全都是你的钥匙在字典NSStrings?我认为他们必须为了节省字典中的属性列表。

最简单的回答:

NSDictionary 只是一个 plist对象 如果的 钥匙是NSStrings.因此,商店的 "钥匙" 作为 NSStringstringWithFormat.


方案:

NSString *key = [NSString stringWithFormat:@"%@",[dictionary valueForKey:@"Key"]];

福利:

  1. 它将增加 串的价值.
  2. 它将增加 空值 当你的价值的变量 NULL.

你有没有考虑在寻找实现NSCoding协议?这将允许你编码,并与该NSCoding实现两个简单的方法对iPhone进行解码。首先,你需要添加NSCoding上您的课。

下面是一个例子:

这是在.h文件

@interface GameContent : NSObject <NSCoding>

然后,你将需要实现NSCoding协议的两种方法。

    - (id) initWithCoder: (NSCoder *)coder
    {
        if (self = [super init])
        {
               [self setFoundHotSpots:[coder decodeObjectForKey:@"foundHotSpots"]];
        }
        return self;
    }

    - (void) encodeWithCoder: (NSCoder *)coder
    {
           [coder encodeObject:foundHotSpots forKey:@"foundHotSpots"];
    }

查看上NSCoder的文档的详细信息。这已经在非常方便为我的项目,我需要保存在iPhone上的应用程序的状态如果应用程序是封闭的,它恢复到它的状态时,其重新打开。

的关键是要在协议添加到界面,然后实现两种方法是NSCoding的一部分。

我希望这有助于!

有没有更好的解决方案。另一种选择是只保存编码对象到磁盘 - 但那是做同样的事情。他们都结束了的NSData当你想回的是被解码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top