wake-up-neo.com

Löschen Sie alle Schlüssel aus einem NSUserDefaults-Wörterbuch für iOS

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 ....

59
Tono Nam

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];
}
139
Alex Nichol

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];
68
skywinder

Einzeiler

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
44
Cameron E

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)
}
22
Sourabh Sharma

Schnelle Version:

if let bid = NSBundle.mainBundle().bundleIdentifier {
    NSUserDefaults.standardUserDefaults().removePersistentDomainForName(bid)
}   
16
superarts.org

+ (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.

16
darvids0n

Oneliner in Swift:

Swift 3  

NSUserDefaults.standardUserDefaults().removePersistentDomainForName(
NSBundle.mainBundle().bundleIdentifier!)

Swift 4

UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
7
netshark1000

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)
}
7
bogen

Für Swift 3:

let appDomain = Bundle.main.bundleIdentifier!
UserDefaults.standard.removePersistentDomain(forName: appDomain)
5
Taichi Kato

Für Swift 3:

if let bundle = Bundle.main.bundleIdentifier {
    UserDefaults.standard.removePersistentDomain(forName: bundle)
}
5
Jay Mehta

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()

}
2
Dhananjay Patil

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()
}
1
Dzmitry Chyrta

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.

1
PengOne

Swift
Platziere in deiner Logik

if let appDomain = Bundle.main.bundleIdentifier {
       UserDefaults.standard.removePersistentDomain(forName: appDomain)
     }
1
Sai kumar Reddy

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()
  }
0
Hardik Thakkar