为什么NSUserDefaults未能保存NSMutableDictionary在iOS?
-
19-08-2019 - |
题
我想要救一个 NSMutableDictionary
对象 NSUserDefaults
.关键的类型 NSMutableDictionary
是 NSString
, ,值类型 NSArray
, ,其中包含一系列的对象它实现 NSCoding
.每文件, NSString
和 NSArray
两者都符合 NSCoding
.
我得到这个错误:
[NSUserDefaults setObject:forKey:]:试图插入非财产。类NSCFDictionary.
解决方案
我发现了一个替代方案中,前保存,我使用编码NSArray
根对象(NSKeyedArchiver
对象),它与NSData
结束。然后使用UserDefaults保存NSData
。
当我所需要的数据,我读出NSData
,并使用NSKeyedUnarchiver
到NSData
转换回该对象。
这是一个有点麻烦,因为我需要转换到/自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属性列表类NSDictionary
,NSArray
,NSString
,NSDate
,NSData
,和NSNumber
。你可以写可变的子类(如NSMutableDictionary
)用户的喜好,但是你读出的对象将永远是一成不变的。
全都是你的钥匙在字典NSString
s?我认为他们必须为了节省字典中的属性列表。
最简单的回答:
NSDictionary
只是一个 plist对象 如果的 钥匙是NSStrings.因此,商店的 "钥匙" 作为 NSString
与 stringWithFormat
.
方案:
NSString *key = [NSString stringWithFormat:@"%@",[dictionary valueForKey:@"Key"]];
福利:
- 它将增加 串的价值.
- 它将增加 空值 当你的价值的变量
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当你想回的是被解码。