NSUserDefaults Clearing

voturi
274

Sunt folosind +[NSUserDefaults standardUserDefaults]pentru a stoca setările aplicației. Aceasta constă din valori șir aproximativ o duzină. Este posibilă ștergerea acestor valori în permanență în loc să - i setarea la o valoare implicită?

Întrebat 13/02/2009 la 08:49
sursa de către utilizator
În alte limbi...                            


15 răspunsuri

voturi
495

Aveți posibilitatea să eliminați domeniul persistente aplicației ca aceasta:

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

În Swift 3 și mai târziu:

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

Acest lucru este similar cu răspunsul de @samvermette, dar este un pic mai curat OMI.

Publicat 26/07/2011 la 03:55
sursa de către utilizator

voturi
101

Acest cod resetează implicit la domeniul de înregistrare:

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

Cu alte cuvinte, removeObjectForKeypentru fiecare cheie unică ați înregistrat vreodată în aplicația respectivă .

Credite Ken Thomases de pe acest Apple a Developer Forum thread.

Publicat 10/06/2010 la 05:40
sursa de către utilizator

voturi
95

Ai încercat utilizați - removeObjectForKey?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Publicat 13/02/2009 la 08:51
sursa de către utilizator

voturi
29

Aici este răspunsul în Swift:

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Publicat 15/04/2015 la 14:36
sursa de către utilizator

voturi
27

Dacă aveți nevoie de ea în timp ce în curs de dezvoltare, puteți reseta , de asemenea , simulator de dvs., ștergând toate NSUserDefaults.

iOS Simulator -> Reset Conținut și setări ...

Țineți cont de faptul că va șterge, de asemenea, toate aplicațiile și fișierele de pe simulator.

Publicat 06/09/2011 la 15:54
sursa de către utilizator

voturi
13
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
Publicat 20/01/2014 la 04:56
sursa de către utilizator

voturi
6

În Swift:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Publicat 18/08/2016 la 10:36
sursa de către utilizator

voturi
5

Îmi place extensii atunci când fac curat codul:

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

        self.removePersistentDomainForName(domainName)
    }
}
Publicat 22/08/2016 la 22:33
sursa de către utilizator

voturi
5

Notă: Acest răspuns a fost actualizat pentru Swift prea.

Ce zici să-l aibă pe o singură linie?

Extinderea răspunsului @Christopher Rogers - cel acceptat.

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

si da, uneori poate fi necesar să - synchronizel,

[[NSUserDefaults standardUserDefaults] synchronize];

Am creat o metodă de a face acest lucru,

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

Swift ?

Cu rapidă său chiar mai ușor.

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

Și utilizare :

UserDefaults.clean()
Publicat 11/08/2015 la 06:02
sursa de către utilizator

voturi
5

Am gasit asta:

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 "{}"

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

Publicat 04/12/2014 la 18:33
sursa de către utilizator

voturi
2

Este un bug sau orice altceva , dar removePersistentDomainForNamenu este de lucru în timp de compensare toate NSUserDefaultsvalorile.

Deci, opțiune mai bună este că , pentru a reseta PersistentDomainși care le puteți face prin următorul mod:

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Publicat 09/03/2016 la 08:28
sursa de către utilizator

voturi
1

Toate răspunsurile de mai sus sunt foarte relevante, dar dacă cineva încă în imposibilitatea de a reseta userdefaults pentru aplicația șters, atunci puteți reseta setările de conținut ale tine simulator, și va funcționa.introduceți descrierea imaginii aici

Publicat 16/10/2014 la 09:44
sursa de către utilizator

voturi
1

Extinderea răspunsul @ folse lui ... cred că o punere în aplicare mai corectă ar fi ...

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];
    }

... de asteptare NSUserDefault lui persistentDomainForName: metoda. Deoarece starea docs, metoda „Returnează un dicționar care conține cheile și valorile din domeniul specificat persistente.“ Apelarea dictionaryRepresentation: în schimb, va returna un dicționar care va include probabil alte setări care se aplică la un domeniu de aplicare mai larg.

Dacă aveți nevoie pentru a filtra oricare dintre valorile care urmează să fie resetat, atunci iterarea cheilor este modul de a face acest lucru. Evident, dacă doriți să bombardeze doar toate prefs pentru aplicația fără a ține seama, atunci una dintre celelalte metode postate mai sus este cel mai eficient.

Publicat 18/02/2014 la 02:42
sursa de către utilizator

voturi
0

Încercați acest lucru, este de lucru pentru mine.

Un singur rând de cod

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
Publicat 01/03/2018 la 05:57
sursa de către utilizator

voturi
0

dacă setarea de aplicare a fi nevoie de resetare este nsuserdefault pentru a avea acces la microfon (cazul meu), o soluție simplă este răspunsul de la Anthony McCormick ( Iphone - Cum de a permite accesul la aplicații media pe dispozitivul? - Cod ALAssetsLibraryErrorDomain = -3312 „Global refuzat accesul“ ).

pe dispozitiv, accesați Setări> General> Reset> Resetați avertismente locație

Publicat 15/08/2014 la 00:15
sursa de către utilizator

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