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?
NSUserDefaults de compensation
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.
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.
Avez - vous essayé en utilisant - removeObjectForKey?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Voici la réponse à Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
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.
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
Dans Swift:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
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)
}
}
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()
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
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!)
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.
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.
Essayez ceci, cela fonctionne pour moi.
ligne de code unique
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
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













