web-dev-qa-db-fra.com

Supprimer toutes les clés d'un dictionnaire NSUserDefaults iOS

J'utilise le dictionnaire NSUserDefaults pour stocker des informations de base telles que les meilleurs scores, etc. de sorte que lorsque l'utilisateur ferme les données de l'application ne soient pas perdues. En tout cas j'utilise:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];

pour stocker des données. Si je souhaite enregistrer un nouveau meilleur score par exemple, je ferais:

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

et plus tard si je souhaite récupérer le meilleur score, je le ferais:

[prefs integerForKey:@"highScore"];

quoi qu'il en soit, le fait est que je stocke beaucoup d'autres choses car le NSUserDefaults enable vous permet de stocker booleans, integers, objects etc. Quelle méthode devrais-je exécuter pour supprimer toutes les clés de sorte que NSUserDefaults devienne comme la première fois que je lance l'application?

Je cherche quelque chose comme:

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

ou peut-être y a-t-il un moyen d'obtenir toutes les clés et je dois passer en revue chaque objet mais je ne sais pas comment les supprimer. 

MODIFIER:

J'ai essayé :

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

et je suis encore capable de récupérer un score élevé ....

59
Tono Nam

Si vous consultez la documentation NSUserDefaults , vous verrez une méthode - (NSDictionary *) dictionaryRepresentation. En utilisant cette méthode sur les valeurs par défaut de l'utilisateur standard, vous pouvez obtenir une liste de toutes les clés des valeurs par défaut de l'utilisateur. Vous pouvez ensuite l'utiliser pour effacer les valeurs par défaut de l'utilisateur:

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

La façon la plus rapide de faire cela avec les mêmes résultats comme dans la réponse principale d'Alex Nichol:

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

Bon mot

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
44
Cameron E

Solution simple  

Objectif c: 

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

Dans Swift 3.0:

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

Version rapide:

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

+ (void) resetStandardUserDefaults ne persiste pas dans les modifications, il réinitialise simplement l'objet utilisateur par défaut en mémoire afin que le prochain appel synchronize lise la copie sur disque, au lieu de remplacer les valeurs en mémoire existantes par les versions sur disque.

Itérer sur les touches est mieux, mais il existe en fait une fonction qui le fait pour vous: 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];

À la fin de l'opération synchronize, les copies sur disque et en mémoire des valeurs utilisateur par défaut ne contiendront aucune des valeurs définies par votre application.

16
darvids0n

Oneliner à Swift:

Swift 3  

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

Swift 4

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

Pour ceux d'entre vous qui veulent faire cela dans la cible de test, utilisez ceci (car la variable removePersistentDomain ne fonctionne pas pour ce cas) 

Swift 3:

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

Pour Swift 3:

let appDomain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: appDomain)
5
Taichi Kato

Pour Swift 3:

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

Rapide 

 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
Dhananjay Patil

Swift 3 ou 4 Nous pouvons même simplifier l'extrait décrit dans cette expression moderne:

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

Cette méthode ne fait-elle pas cela:

+ (void)resetStandardUserDefaults

De la documentation pour NSUserDefaults:

resetStandardUserDefaults

Synchronise toutes les modifications apportées à l'objet par défaut d'utilisateur partagé et le libère de la mémoire.

+ (void)resetStandardUserDefaults

Discussion

Un appel ultérieur de standardUserDefaults crée un nouvel objet par défaut d'utilisateur partagé avec la liste de recherche standard.

Sur cette base, vous pouvez faire:

[NSUserDefaults resetStandardUserDefaults];
[NSUserDefaults standardUserDefaults];

et maintenant les valeurs par défaut devraient être réinitialisées.

1
PengOne

Rapide
place dans votre logique

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

Pour supprimer toutes les valeurs UserDefault dans Swift (syntaxe la plus récente)

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