Ich verwende das NSUserDefaults-Wörterbuch, um grundlegende Informationen wie Highscores usw. zu speichern, damit beim Schließen des Benutzers die App-Daten nicht verloren gehen. Sowieso benutze ich:
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
Daten speichern. Wenn ich zum Beispiel einen neuen Highscore speichern möchte, würde ich Folgendes tun:
[prefs setInteger:1023 forKey:@"highScore"];
[prefs synchronize]; //this is needed in case the app is closed.
und später, wenn ich den Highscore abrufen möchte, würde ich tun:
[prefs integerForKey:@"highScore"];
sowieso der Punkt ist , dass ich eine Menge anderer Dinge speichern , weil die NSUserDefaults enable
Sie speichern booleans
, integers
, objects
usw. , welche Methode würde ich alle Schlüssel ausführen müssen , um zu löschen , so dass NSUserDefaults wie die Faust Zeit wird ich die App starten?
Ich suche so etwas wie:
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs deleteAllKeysAndObjectsInTheDictionary];
oder vielleicht gibt es eine Möglichkeit, alle Schlüssel zu erhalten, und ich muss jedes Objekt durchlaufen, aber ich weiß nicht, wie ich sie entfernen soll.
BEARBEITEN:
Ich habe versucht :
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[NSUserDefaults resetStandardUserDefaults];
[prefs synchronize];
und ich bin immer noch in der Lage, eine hohe Punktzahl abzurufen ....
quelle
Antworten:
Wenn Sie sich die Dokumentation zu NSUserDefaults ansehen, sehen Sie eine Methode
- (NSDictionary *) dictionaryRepresentation
. Mit dieser Methode können Sie in den Standardbenutzerstandards eine Liste aller Schlüssel in den Benutzerstandards abrufen. Sie können dies dann verwenden, um die Benutzerstandards zu löschen:- (void)resetDefaults { NSUserDefaults * defs = [NSUserDefaults standardUserDefaults]; NSDictionary * dict = [defs dictionaryRepresentation]; for (id key in dict) { [defs removeObjectForKey:key]; } [defs synchronize]; }
quelle
______________________________________________
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
__________________
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
NSUserDefaults
...Der kürzeste Weg, dies mit den gleichen Ergebnissen wie in Alex Nichols Top-Antwort zu tun :
NSString *appDomain = NSBundle.mainBundle.bundleIdentifier; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain]; [[NSUserDefaults standardUserDefaults] synchronize];
quelle
synchronize
Sie nicht gleich danach Ihre NSUserDefaults, wenn Sie die Standardeinstellungen so verwenden, dass dies erforderlich ist.persistentDomainForName
und ihn mit zu entfernenremoveObjectForKey
.Einzeiler:
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:NSBundle.mainBundle.bundleIdentifier];
quelle
synchronize
Sie nicht gleich danach Ihre NSUserDefaults, wenn Sie die Standardeinstellungen so verwenden, dass dies erforderlich ist.Einfache Lösung
Ziel c:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier]; [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
Swift 3.0 bis Swift 5.0:
if let appDomain = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: appDomain) }
quelle
Schnelle Version:
if let bid = NSBundle.mainBundle().bundleIdentifier { NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid) }
quelle
+ (void) resetStandardUserDefaults
Die Änderungen werden nicht beibehalten, sondern lediglich das Standardobjekt des In-Memory-Benutzers zurückgesetzt, sodass der nächstesynchronize
Aufruf von der Kopie auf der Festplatte gelesen wird, anstatt vorhandene In-Memory-Werte mit den On-Disk-Versionen zu überschreiben.Das Iterieren über die Tasten ist besser, aber es gibt tatsächlich eine Funktion, die dies für Sie erledigt :
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];
Am Ende des
synchronize
Vorgangs enthalten sowohl die Festplatten- als auch die Speicherkopien der Benutzerstandards keinen der von Ihrer Anwendung festgelegten Werte.quelle
Oneliner in Swift:
Swift 3
NSUserDefaults.standardUserDefaults().removePersistentDomainForName( NSBundle.mainBundle().bundleIdentifier!)
Swift 4
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
quelle
.synchronize()
. Das machst du nie in so normalen Situationen. Inhalte werden automatisch gespeichert.synchronize
ist nicht nur "speichern".synchronize
speichert und lädt das gesamte Standardobjekt (das größer als erwartet sein kann). Es ist niemals notwendig aufzurufensynchronize
, um die Standardeinstellungen zu "speichern". Wenn Sie es nennen, müssen Sie einen guten Grund haben, und diese sind selten. ;)Verwenden Sie dies für diejenigen unter Ihnen, die dies im Testziel tun möchten (da dies in
removePersistentDomain
diesem Fall nicht funktioniert).Swift 3:
for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) { UserDefaults.standard.removeObject(forKey: key) }
quelle
Für Swift 3:
let appDomain = Bundle.main.bundleIdentifier! UserDefaults.standard.removePersistentDomain(forName: appDomain)
quelle
Für Swift 3:
if let bundle = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: bundle) }
quelle
Schnell
func resetUserDefaults(){ let userDefaults = NSUserDefaults.standardUserDefaults() let dict = userDefaults.dictionaryRepresentation() as NSDictionary for key in dict.allKeys { userDefaults.removeObjectForKey(key as! String) } userDefaults.synchronize() }
quelle
Schneller
Platz in Ihrer Logik
if let appDomain = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: appDomain) }
quelle
Tut diese Methode das nicht:
+ (void)resetStandardUserDefaults
Aus der Dokumentation für
NSUserDefaults
:Auf dieser Grundlage können Sie Folgendes tun:
[NSUserDefaults resetStandardUserDefaults]; [NSUserDefaults standardUserDefaults];
und jetzt sollten die Standardeinstellungen zurückgesetzt werden.
quelle
[NSUserDefaults resetStandardUserDefaults];
und dann tunNSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
, ist mein Verständnis (was möglicherweise falsch ist), dassprefs
es wieder eine leere Tafel sein wird.Swift 3 oder 4 Wir können das beschriebene Snippet sogar in diesem modernen Ausdruck vereinfachen:
func clearAll() { let settingsDictionary = userDefaults.dictionaryRepresentation() settingsDictionary.forEach { key, _ in userDefaults.removeObject(forKey: key) } userDefaults.synchronize() }
quelle
So entfernen Sie alle UserDefault-Werte in Swift (neueste Syntax)
//remove UserDefaults if let identifier = Bundle.main.bundleIdentifier { UserDefaults.standard.removePersistentDomain(forName: identifier) UserDefaults.standard.synchronize() }
quelle
Ich fand es am praktischsten, den Code in einer Erweiterung zu platzieren
UserDefaults
.Swift 5
extension UserDefaults { static func clear() { guard let domain = Bundle.main.bundleIdentifier else { return } UserDefaults.standard.removePersistentDomain(forName: domain) UserDefaults.standard.synchronize() } }
Verwendung
UserDefaults.clear()
quelle