Ich verwende das NSUserDefaults-Wörterbuch, um grundlegende Informationen wie hohe Punktzahlen usw. zu speichern, damit beim Schließen der App keine Daten verloren gehen. Wie auch immer ich benutze:
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
um Daten zu 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 die hohe Punktzahl abrufen möchte, würde ich Folgendes tun:
[prefs integerForKey:@"highScore"];
der Punkt ist sowieso, dass ich viele andere Dinge speichere, weil der NSUserDefaults enable
Sie booleans
, integers
, objects
usw. speichert. Welche Methode müsste ich ausführen, um alle Schlüssel zu löschen, so dass NSUserDefaults zum ersten Mal wird, wenn ich die App starte?
Ich suche nach 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 kann immer noch eine hohe Punktzahl abrufen ....
Wenn Sie sich die NSUserDefaults-Dokumentation anschauen sehen Sie eine Methode - (NSDictionary *) dictionaryRepresentation
. Bei Verwendung dieser Methode für die Standardbenutzerstandards können Sie eine Liste aller Schlüssel in den Benutzerstandards abrufen. Anschließend können Sie die Standardeinstellungen des Benutzers löschen:
- (void)resetDefaults {
NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
NSDictionary * dict = [defs dictionaryRepresentation];
for (id key in dict) {
[defs removeObjectForKey:key];
}
[defs synchronize];
}
Kürzester Weg mit den gleichen Ergebnissen wie in der besten Antwort von Alex Nichol
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
[[NSUserDefaults standardUserDefaults] synchronize];
Einzeiler
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
Einfache Lösung
Ziel c:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
In Swift 3.0:
if let appDomain = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
Schnelle Version:
if let bid = NSBundle.mainBundle().bundleIdentifier {
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid)
}
+ (void) resetStandardUserDefaults
behält die Änderungen nicht bei, sondern setzt lediglich das In-Memory-Standardobjekt für Benutzer zurück, sodass der nächste synchronize
-Aufruf von der Kopie auf der Festplatte liest, anstatt vorhandene In-Memory-Werte mit den Versionen auf der Festplatte zu überschreiben.
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 der synchronize
-Operation enthalten sowohl die Datenträger- als auch die Speicherkopien der Benutzerstandardwerte keine der von Ihrer Anwendung festgelegten Werte.
Oneliner in Swift:
Swift 3
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(
NSBundle.mainBundle().bundleIdentifier!)
Swift 4
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
Für diejenigen von Ihnen, die dies im Testziel tun möchten, verwenden Sie dies (da die removePersistentDomain
für diesen Fall nicht funktioniert).
Swift 3:
for key in Array(UserDefaults.standard.dictionaryRepresentation().keys) {
UserDefaults.standard.removeObject(forKey: key)
}
Für Swift 3:
let appDomain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: appDomain)
Für Swift 3:
if let bundle = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundle)
}
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()
}
Swift 3 oder 4 Wir können sogar den beschriebenen Ausschnitt in diesen modernen Ausdruck vereinfachen:
func clearAll() {
let settingsDictionary = userDefaults.dictionaryRepresentation()
settingsDictionary.forEach { key, _ in userDefaults.removeObject(forKey: key) }
userDefaults.synchronize()
}
Tut diese Methode das nicht:
+ (void)resetStandardUserDefaults
Aus der Dokumentation für NSUserDefaults
:
resetStandardUserDefaults
Synchronisiert alle am freigegebenen Benutzer-Standardobjekt vorgenommenen Änderungen und gibt es aus dem Speicher frei.
+ (void)resetStandardUserDefaults
Diskussion
Ein nachfolgender Aufruf von standardUserDefaults erstellt ein neues gemeinsames Standardbenutzerobjekt mit der Standardsuchliste.
Auf dieser Grundlage können Sie Folgendes tun:
[NSUserDefaults resetStandardUserDefaults];
[NSUserDefaults standardUserDefaults];
und jetzt sollten die Standardeinstellungen zurückgesetzt werden.
Swift
Platziere in deiner Logik
if let appDomain = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: appDomain)
}
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()
}