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é ....
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];
}
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];
Bon mot
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
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)
}
Version rapide:
if let bid = NSBundle.mainBundle().bundleIdentifier {
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid)
}
+ (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.
Oneliner à Swift:
Swift 3
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(
NSBundle.mainBundle().bundleIdentifier!)
Swift 4
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
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)
}
Pour Swift 3:
let appDomain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: appDomain)
Pour Swift 3:
if let bundle = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundle)
}
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()
}
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()
}
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.
Rapide
place dans votre logique
if let appDomain = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
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()
}