【问题标题】:iPhone: Not able to store NSMutableDictionary to NSUserDefaultsiPhone:无法将 NSMutableDictionary 存储到 NSUserDefaults
【发布时间】:2011-09-29 16:53:38
【问题描述】:

我正在尝试使用 NSMutableDictionary 实现“添加到收藏夹”功能,因为我必须添加多个键值。即使将对象添加到字典后,以下 addToFavourites 方法也始终显示 Count=0。我读了this 并将nsdefaults 放入mutabledictionary(而不是可变数组)并将结果字典设置回nsdefaults 但不确定是什么问题。任何帮助将非常感激。谢谢。

编辑: 从this 我开始知道我必须在可变和不可变字典中移动数据,然后它就可以正常工作了!但仍然无法将修改后的 NSMutableDictionary 同步到 NSUserDefaults。

-(BOOL)isAddedToFavorites:(NSString*)viewID {
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *favourites = [[standardUserDefaults objectForKey:kFavouriteItemsKey] mutableCopy];

if(favourites && [[favourites objectForKey:kFavouriteItemsKey] objectForKey:viewID])
return YES;

return NO;
}

-(void)addToFavourites:(NSString*)viewID viewType:(NSString*)viewType {
NSMutableDictionary *myMutableDictionary= [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]+1];
[myMutableDictionary addEntriesFromDictionary:myDictionary];
[myMutableDictionary setObject:myObject forKey:myKey];


// Modified dictionary is not getting synced
[[NSUserDefaults standardUserDefaults]  setObject:myMutableDictionary  forKey:kFavouriteItemsKey];
[[NSUserDefaults standardUserDefaults]  synchronize];
}

尝试将字典数据编码为 NSData,经过轻微但严重的更正后它现在可以工作了!

-(BOOL)isAddedToFavorites:(NSString*)viewID {

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:kFavouriteItemsKey];
NSDictionary *favourites = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

if(favourites && [favourites objectForKey:viewID])
    return YES;

return NO;
}

-(void)addToFavourites:(NSString*)viewID viewType:(NSString*)viewType {

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *data = [defaults objectForKey:kFavouriteItemsKey];
NSDictionary *myDictionary = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

NSMutableDictionary *myMutableDictionary= [NSMutableDictionary dictionaryWithCapacity:[myDictionary count]+1];
[myMutableDictionary addEntriesFromDictionary:myDictionary];
[myMutableDictionary setObject:viewType forKey:viewID];


NSData *newdata = [NSKeyedArchiver archivedDataWithRootObject:myMutableDictionary];
[[NSUserDefaults standardUserDefaults] setObject:newdata forKey:kFavouriteItemsKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}

谢谢。

【问题讨论】:

  • 这个stackoverflow.com/questions/471830/… 似乎是重复的。有帮助吗?
  • 这实际上看起来不同 AppleDeveloper 正在存储字符串并且仍然存在问题。
  • @Irene:我尝试对字典值进行编码,但仍然无法正常工作!查看已编辑的问题!
  • 在编码字典中使用 [[NSUserDefaults standardUserDefaults] synchronize]; }
  • 天啊,成功了!有两件事是我的错误:首先在编码后我没有同步 NSData。其次,我将 ViewType 存储为 Key 但检查 ViewID!更正了它们,它起作用了。

标签: iphone nsuserdefaults nsmutabledictionary


【解决方案1】:

您需要为字典中的元素实现此功能:

字典中的元素实现

@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;
}

正如@Irene 提供的链接所建议的那样。

【讨论】:

  • 嗨 OscarMk,那是我不明白的事情。我不知道这些方法将如何以及何时被调用?它对我有用,但不知道为什么?尝试添加第二个密钥时我有一个小问题。我的 XCode 挂了!不知道是不是因为这个,但试图解决它。在已编辑的问题中查看我的完整代码。谢谢。
  • @AppleDeveloper 如果 nsdictionary 中的对象尚未实现 NSCoding,则您只需要上面的代码,但如果它有效,那么他们正在实现它。 NSKeyedArchiver 会调用这些方法来取消归档和归档。
  • 太棒了!非常感谢 OscarMk 一路帮助我!它现在工作得很好。 XCode 编辑器挂起可能是由于其他原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 2010-10-03
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多