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 重写的主要内容,如果未能解决你的问题,请参考以下文章