从NSUserDefaults字典iOS中删除所有键

问题描述 投票:60回答:15

我使用NSUserDefaults字典来存储高分等基本信息,这样当用户关闭时,应用程序数据不会丢失。无论如何我使用:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

存储数据。如果我希望存储一个新的高分,那么我会这样做:

[prefs setInteger:1023 forKey:@"highScore"];
[prefs synchronize];  //this is needed in case the app is closed. 

后来如果我想获得高分我会做:

[prefs integerForKey:@"highScore"];

无论如何,关键是我存储了很多其他东西,因为NSUserDefaults enable你要存储booleansintegersobjects等。我必须执行什么方法才能删除所有键,以便NSUserDefaults变得像我第一次启动应用程序一样?

我正在寻找类似的东西:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs deleteAllKeysAndObjectsInTheDictionary];

或者可能有一种获取所有键的方法,我必须遍历每个对象,但我不知道如何删除它们。

编辑:

我试过了 :

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[NSUserDefaults resetStandardUserDefaults];
[prefs synchronize];

我仍然能够获得高分....

ios objective-c swift cocoa-touch nsuserdefaults
15个回答
142
投票

如果你看看NSUserDefaults documentation,你会看到一个方法- (NSDictionary *) dictionaryRepresentation。在标准用户默认值上使用此方法,您可以获取用户默认值中所有键的列表。然后,您可以使用它来清除用户默认值:

- (void)resetDefaults {
    NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
    NSDictionary * dict = [defs dictionaryRepresentation];
    for (id key in dict) {
        [defs removeObjectForKey:key];
    }
    [defs synchronize];
}

5
投票

对于Swift 3:

if let bundle = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundle)
}

2
投票

迅速

 func resetUserDefaults(){

    let userDefaults = NSUserDefaults.standardUserDefaults()
    let dict = userDefaults.dictionaryRepresentation() as NSDictionary

    for key in dict.allKeys {

            userDefaults.removeObjectForKey(key as! String)
    }

    userDefaults.synchronize()

}

2
投票

迅速 放在你的逻辑中

if let appDomain = Bundle.main.bundleIdentifier {
       UserDefaults.standard.removePersistentDomain(forName: appDomain)
     }

1
投票

这种方法不这样做:

+ (void)resetStandardUserDefaults

NSUserDefaults的文档:

resetStandardUserDefaults

同步对共享用户默认值对象所做的任何更改,并将其从内存中释放。

+ (void)resetStandardUserDefaults

讨论

随后调用standardUserDefaults会使用标准搜索列表创建新的共享用户默认值对象。

基于此,您可以:

[NSUserDefaults resetStandardUserDefaults];
[NSUserDefaults standardUserDefaults];

现在应该重置默认值。


1
投票

Swift 3或4我们甚至可以将描述的片段简化为这个现代表达式:

func clearAll() {
    let settingsDictionary = userDefaults.dictionaryRepresentation()
    settingsDictionary.forEach { key, _ in userDefaults.removeObject(forKey: key) }
    userDefaults.synchronize()
}

0
投票

删除swift中的所有UserDefault值(最新语法)

//remove UserDefaults
  if let identifier = Bundle.main.bundleIdentifier {
      UserDefaults.standard.removePersistentDomain(forName: identifier)
      UserDefaults.standard.synchronize()
  }

70
投票

使用与Alex Nichol的最佳答案相同的结果来做到这一点的最短路径:

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
[[NSUserDefaults standardUserDefaults] synchronize];

44
投票

一个班轮

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];

23
投票

简单解决方案

目标C:

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];

在Swift 3.0中:

if let appDomain = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: appDomain)
}

16
投票

Swift版本:

if let bid = NSBundle.mainBundle().bundleIdentifier {
    NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid)
}   

16
投票

+ (void) resetStandardUserDefaults不会保留更改,它只是重置内存中的用户默认值对象,以便下一个synchronize调用将从磁盘副本读取,而不是使用磁盘版本覆盖现有的内存中值。

迭代键更好,但实际上有一个函数可以为你做这个:removePersistentDomainForName:

// you can usually get the domain via [[NSBundle mainBundle] bundleIdentifier]
[[NSUserDefaults standardUserDefaults]
 removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
// or use a string for any other settings domains you use
//[[NSUserDefaults standardUserDefaults]
// removePersistentDomainForName:@"com.mycompany.myappname"];
[[NSUserDefaults standardUserDefaults] synchronize];

synchronize操作结束时,用户默认值的磁盘和内存副本都不包含应用程序设置的值。


9
投票

对于那些想要在测试目标中执行此操作的人,请使用此(因为removePersistentDomain不适用于该情况)

斯威夫特3:

for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) {
     UserDefaults.standard.removeObject(forKey: key)
}

8
投票

Swift的Oneliner:

斯威夫特3

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(
NSBundle.mainBundle().bundleIdentifier!)

斯威夫特4

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)

5
投票

对于Swift 3:

let appDomain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: appDomain)
© www.soinside.com 2019 - 2024. All rights reserved.