Objective C - UserDefaults 重写

Posted

技术标签:

【中文标题】Objective C - UserDefaults 重写【英文标题】:Objective C - UserDefaults Over Writing 【发布时间】:2012-05-19 00:53:57 【问题描述】:

我似乎无法在我的 ios 用户默认设置中重新编辑此对象。这是我的代码...

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:nil forKey:@"savedScoreCards2"];

在我这样做之前,我将键 savedScoreCards 设置为一个巨大的 3-d 字典,现在当我尝试重写它甚至将键设置为 nil 时,我之前设置的那个巨大的 3-d 字典是还在那里。我似乎无法过度写入/替​​换它(零)或另一个巨大的 3-d 字典。有什么想法吗?

更新:

  + (void)saveCurrentScoreCard 
  
    //save score card
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSMutableDictionary *savedScoreCards = [[NSMutableDictionary alloc] init];
    [userDefaults setObject:nil forKey:@"savedScoreCards2"];//reset at beginning

    NSMutableArray *golferOneScoresu = [userDefaults arrayForKey:@"golferOneScoresArray"];
    NSMutableArray *golferTwoScoresu = [userDefaults arrayForKey:@"golferTwoScoresArray"];
    NSMutableDictionary *golferIconsu = [userDefaults objectForKey:@"golferIconsFirstScene"];
    NSMutableArray *golferThreeScoresu = [userDefaults arrayForKey:@"golferThreeScoresArray"];
    NSMutableArray *golferFourScoresu = [userDefaults arrayForKey:@"golferFourScoresArray"];
    NSMutableDictionary *golferIcons2u = [userDefaults objectForKey:@"golferIcons"];
    NSMutableArray *golferNamesu = [userDefaults objectForKey:@"golferNames"];

    NSMutableArray *golferNames = [[NSMutableArray alloc] initWithArray:golferNamesu copyItems:YES];
    NSMutableDictionary *golferIconsSceneOne = [[NSMutableDictionary alloc]initWithDictionary:golferIconsu];
    NSMutableDictionary *golferIcons = [[NSMutableDictionary alloc]initWithDictionary:golferIcons2u];
    NSMutableArray *golferFourScores = [[NSMutableArray alloc] initWithArray:golferFourScoresu copyItems:YES];
    NSMutableArray *golferThreeScores = [[NSMutableArray alloc] initWithArray:golferThreeScoresu copyItems:YES];
    NSMutableArray *golferOneScores = [[NSMutableArray alloc] initWithArray:golferOneScoresu copyItems:YES];
    NSMutableArray *golferTwoScores = [[NSMutableArray alloc] initWithArray:golferTwoScoresu copyItems:YES];

    NSMutableDictionary *currentScoreCard = [[NSMutableDictionary alloc] init];

    [currentScoreCard setObject:golferNames forKey:@"golferNames"];
    [currentScoreCard setObject:golferIconsSceneOne forKey:@"golferIconsFirstScene"];
    [currentScoreCard setObject:golferIcons forKey:@"golferIcons"];
    [currentScoreCard setObject:golferOneScores forKey:@"golferOneScoresArray"];
    [currentScoreCard setObject:golferTwoScores forKey:@"golferTwoScoresArray"];
    [currentScoreCard setObject:golferThreeScores forKey:@"golferThreeScoresArray"];
    [currentScoreCard setObject:golferFourScores forKey:@"golferFourScoresArray"];

    [savedScoreCards setObject:currentScoreCard forKey:@"1"];

    NSLog([golferIconsSceneOne objectForKey:@"30101"]);

    [userDefaults setObject:savedScoreCards forKey:@"savedScoreCards2"];
    [userDefaults synchronize];
    NSLog(@"SAVED SCORE CARD");

【问题讨论】:

aside:作为编程“最佳实践”的问题,如果您多次使用字符串文字,则应将其放入范围尽可能有限的变量中,或者可选地使用 #define 语句这样任何错别字都不会让你误入歧途 【参考方案1】:

如果您只是想删除存储的值,请使用 [userDefaults removeObjectForKey:@"savedScoreCards2"]。 还请致电[userDefaults synchronize]; 立即“刷新”您的更改。我认为[userDefaults synchronize] 可能是您所缺少的。

【讨论】:

也许您还缺少其他东西。或者您的模拟器可能处于不稳定状态。重置并重试... 我在一个单独的类中更改用户默认值,从我打开它们的位置... 我刚刚用应该保存我的数据的整个方法更新了我的问题...【参考方案2】:

当您对它们进行更改时,NSUserDefaults 不会自动保存。尝试在您上面发布的行下方添加此行:

[userDefaults synchronize];

这应该会保存您所做的任何更改。

附带说明,我不确定您是否可以将“nil”保存到 NSUserDefaults;我相信它的核心是一本字典,其中不能设置 nil 值。因此,您可以尝试设置一个空对象。

希望对您有所帮助,如果您需要更多信息,请告诉我!

【讨论】:

@"savedScoreCards2" 中究竟存储了什么样的对象?它是自定义数据类型吗?当您尝试覆盖它时,您是否正在验证您设置的对象是否有效(即不是 nil)? 这是一个巨大的 3-d NSMutableDictionary。 字典的最底层包含哪些对象?不符合 NSCoding 的对象不能存储在 NSUserDefaults 中。如果做不到这一点,我会从您的设备上删除该应用程序,然后重试;看看能不能解决问题。 我刚刚用应该保存我的数据的整个方法更新了我的问题... 它们比 NSCoding 更受限制——您只能在用户默认值中放置“plist”值:“默认对象必须是属性列表,即(或对于集合实例的组合):NSData、NSString、NSNumber、NSDate、NSArray 或 NSDictionary。" NSUserDefaults Class Ref

以上是关于Objective C - UserDefaults 重写的主要内容,如果未能解决你的问题,请参考以下文章

cocos2dx中的游戏储存-UserDefault

检查 UserDefault 是不是存在 - Swift

使用 UserDefault 快速存储和检索数组数据

Xcode 中的 UserDefault 不保存文本

如何在 UserDefault 中存储推送通知警报消息?

在目标之间共享 UserDefault 不起作用