如何将保存的数据重置为默认值?

6

我正在使用NSUserDefaults在我的应用程序中实现数据保存,就像这样:

[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:0],@"mySetting",nil]];
// check
int firstLaunch = [[NSUserDefaults standardUserDefaults] integerForKey:@"mySetting"];
// set
[[NSUserDefaults standardUserDefaults] setInteger:1 forKey:@"mySetting"];

现在,出于开发目的,我希望能够删除保存的数据并返回默认值,而不必每次都删除应用程序并重新安装。有没有快速的方法可以做到这一点?我认为resetStandardUserDefaults会起作用,但它并没有。

4个回答

13

如果您想要将某个键还原为默认值,-removeObjectForKey: 将从应用程序首选项中删除其定义。所有条件相等的情况下,这意味着后续调用 -<type>ForKey: 将返回已注册的默认值。


10

以下代码片段对我有效。

NSDictionary *defaultsDict = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDict allKeys])
    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];

[[NSUserDefaults standardUserDefaults] synchronize];

不需要调用 [defaultsDict allKeys],因为字典上的 for in 循环会迭代键。 - mcfedr

2
你尝试过在调用重置后重新加载默认设置吗?就像PEZ所说的那样:
例如
[NSUserDefaults resetStandardUserDefaults];
[NSUserDefaults standardUserDefaults];

这将清除所有默认设置并加载标准设置。

如果您只想清除一个值,那么Graham的建议使用-removeObjectForKey更容易。

编辑:更正了我的类方法误用。


1
这并不改变事实,即+resetStandardUserDefaults并不能满足Steph的需求。 - user23743
http://stackoverflow.com/questions/898301/nsuserdefaults-whats-the-resetstandarduserdefaults-method-good-for-how-can-i - nico
我同意你的代码更合适,但是这个例子却不起作用(而Graham的答案可以):[NSUserDefaults resetStandardUserDefaults]; [NSUserDefaults standardUserDefaults]]; NSArray *offlinePages = [[NSUserDefaults standardUserDefaults] objectForKey:OFFLINE_PAGES]; 在调试中仍然返回一个值。你有任何想法为什么吗?因为这个原因我给你的回答投了反对票,如果你能解释一下为什么这是错误的,我会给你点赞。 Vincent - vdaubry
我确实说过Graham的建议更适合重置单个键。您要将此键设置为应用程序默认值是什么? - Abizern
我发现我经常不得不在每件事情完成后同步以使更改生效,所以也许是这样的: [NSUserDefaults resetStandardUserDefaults]; [[NSUserDefaults standardUserDefaults] synchronize]; [NSUserDefaults standardUserDefaults]; [[NSUserDefaults standardUserDefaults] synchronize]; - jsherk

0

关于resetStandardUserDefaults,文档中有如下说明:

后续调用standardUserDefaults将创建一个新的共享用户默认对象,并使用标准搜索列表。

带着一些积极(或许是希望性的)思考,看起来这正是你所需要的。=)


它还说“同步对共享用户默认对象所做的任何更改”,这非常明显表明它不是Steph需要的。 - user23743
不要在长时间休眠后重新启动此线程(太晚了),但是就像_reset_这样的名称一样,我和resetStandardUserDefaults一样处于同一艘船上,它并没有做我期望的事情。:\ - Joe D'Andrea
抱歉,我知道这不是件好笑的事情,只是你说得太妙了。 - PEZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接