NSUserDefaults de compensation

voix
274

J'utilise +[NSUserDefaults standardUserDefaults]pour stocker les paramètres d'application. Il est composé d'environ une douzaine de valeurs de chaîne. Est - il possible de supprimer ces valeurs en permanence au lieu de les fixer à une valeur par défaut?

Créé 13/02/2009 à 08:49
source utilisateur
Dans d'autres langues...                            


15 réponses

voix
495

Vous pouvez supprimer le domaine persistant de l'application comme ceci:

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

Dans Swift 3 et plus tard:

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

Ceci est similaire à la réponse par @samvermette mais est un peu plus propre de l'OMI.

Créé 26/07/2011 à 03:55
source utilisateur

voix
101

Ce code rétablit les valeurs par défaut dans le domaine de l'enregistrement:

[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];

En d' autres termes, il removeObjectForKeypour chaque clé unique que vous jamais enregistré dans cette application.

Crédits à Ken Thomases sur ce Apple Developer Forums fil.

Créé 10/06/2010 à 05:40
source utilisateur

voix
95

Avez - vous essayé en utilisant - removeObjectForKey?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Créé 13/02/2009 à 08:51
source utilisateur

voix
29

Voici la réponse à Swift:

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Créé 15/04/2015 à 14:36
source utilisateur

voix
27

Si vous en avez besoin tout en développant, vous pouvez également réinitialiser votre simulateur, la suppression de tous les NSUserDefaults.

iOS Simulator -> Réinitialiser contenu et réglages ...

Gardez à l'esprit qu'il supprimera également toutes les applications et fichiers sur simulateur.

Créé 06/09/2011 à 15:54
source utilisateur

voix
13
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
Créé 20/01/2014 à 04:56
source utilisateur

voix
6

Dans Swift:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Créé 18/08/2016 à 10:36
source utilisateur

voix
5

J'adore les extensions quand ils font le nettoyeur de code:

extension NSUserDefaults {
    func clear() {
        guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
            return
        }

        self.removePersistentDomainForName(domainName)
    }
}
Créé 22/08/2016 à 22:33
source utilisateur

voix
5

Note: Cette réponse a été mis à jour pour Swift aussi.

Qu'en est-il de l'avoir sur une ligne?

L'extension de réponse @Christopher Rogers - celui qui est accepté.

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

et oui, vous pouvez parfois besoin de synchronizelui,

[[NSUserDefaults standardUserDefaults] synchronize];

J'ai créé une méthode pour ce faire,

- (void) clearDefaults {
    [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

Swift ?

Avec son rapide encore plus facile.

extension UserDefaults {
    class func clean() {
        guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return false }
        self.standard.removePersistentDomain(forName: aValidIdentifier)
        self.standard.synchronize()
    }
}

Et l' utilisation :

UserDefaults.clean()
Créé 11/08/2015 à 06:02
source utilisateur

voix
5

J'ai trouvé ça:

osascript -e 'tell application "iOS Simulator" to quit'
xcrun simctl list devices | grep -v '^[-=]' | cut -d "(" -f2 | cut -d ")" -f1 | xargs -I {} xcrun simctl erase "{}"

Source: https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab

Créé 04/12/2014 à 18:33
source utilisateur

voix
2

Il est un bug ou quoi que mais removePersistentDomainForNamene fonctionne pas en débloquant toutes les NSUserDefaultsvaleurs.

Ainsi, une meilleure option est que pour réinitialiser le PersistentDomainet que vous pouvez le faire via façon suivante:

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Créé 09/03/2016 à 08:28
source utilisateur

voix
1

Toutes les réponses ci-dessus sont très pertinentes, mais si quelqu'un encore incapable de réinitialiser les userdefaults pour l'application supprimé, vous pouvez réinitialiser les paramètres de contenu de votre simulateur, et cela fonctionnera.entrez la description d'image ici

Créé 16/10/2014 à 09:44
source utilisateur

voix
1

L'expansion sur la réponse @ Folse ... Je crois une application plus correcte serait ...

NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] persistentDomainForName: appDomain];
    for (NSString *key in [defaultsDictionary allKeys]) {
      NSLog(@"removing user pref for %@", key);
      [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
    }

... appeler persistentDomainForName de NSUserDefault: méthode. Comme l'état de docs, la méthode « Retourne un dictionnaire contenant les clés et valeurs dans le domaine persistant spécifié. » Appel dictionaryRepresentation: au lieu, retourne un dictionnaire qui inclura probablement d'autres paramètres qu'il applique à une portée plus large.

Si vous avez besoin de filtrer l'une des valeurs qui doivent être remis à zéro, puis itérer sur les touches est la façon de le faire. De toute évidence, si vous voulez juste nuke tous les prefs pour l'application sans tenir compte, alors l'une des autres méthodes ci-dessus est affiché le plus efficace.

Créé 18/02/2014 à 02:42
source utilisateur

voix
0

Essayez ceci, cela fonctionne pour moi.

ligne de code unique

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
Créé 01/03/2018 à 05:57
source utilisateur

voix
0

si le paramètre d'application besoin réinitialisation est nsuserdefault pour l' accès au microphone (mon cas), une solution simple réponse de Anthony McCormick ( Iphone - Comment activer l' accès aux applications aux médias sur l'appareil - ALAssetsLibraryErrorDomain Code = -3312 « L' accès global refusé » ).

sur l'appareil, allez dans Réglages> Général> Réinitialiser> Réinitialiser Avertissements Situation

Créé 15/08/2014 à 00:15
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more