【问题标题】:Objective C - UserDefaults Over WritingObjective C - UserDefaults 重写
【发布时间】: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 语句这样任何错别字都不会让你误入歧途

标签: iphone objective-c ios cocoa-touch ios5


【解决方案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
猜你喜欢
  • 2017-10-25
  • 2014-12-31
  • 2013-12-21
  • 2013-12-24
  • 2010-12-11
  • 2022-01-05
  • 2011-07-27
  • 2011-08-08
相关资源
最近更新 更多