Fjerne NSUserDefaults

stemmer
276

Jeg bruker +[NSUserDefaults standardUserDefaults]å lagre programinnstillinger. Denne består av omtrent et dusin strengverdier. Er det mulig å slette disse verdiene permanent i stedet for bare å sette dem til en standardverdi?

Publisert på 13/02/2009 klokken 07:49
kilden bruker
På andre språk...                            


15 svar

stemmer
499

Du kan fjerne programmet vedvarende domene som dette:

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

I Swift 3 og senere:

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

Dette ligner på svaret ved @samvermette men er litt renere IMO.

Svarte 26/07/2011 kl. 02:55
kilden bruker

stemmer
102

Denne koden tilbakestiller standard til registreringen domene:

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

Med andre ord, det removeObjectForKeyfor hver enkelt tast du noen gang er registrert i det programmet.

Kreditt til Ken Thomases på denne Apple Developer Forum tråd.

Svarte 10/06/2010 kl. 04:40
kilden bruker

stemmer
95

Visste du prøve å bruke - removeObjectForKey?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Svarte 13/02/2009 kl. 07:51
kilden bruker

stemmer
29

Her er svaret i Swift:

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Svarte 15/04/2015 kl. 14:36
kilden bruker

stemmer
27

Hvis du trenger det samtidig utvikle, kan du også tilbakestille simulator, slette alt NSUserDefaults.

iOS Simulator -> Reset innhold og alle innstillinger ...

Husk at det også vil slette alle apps og filer på simulator.

Svarte 06/09/2011 kl. 14:54
kilden bruker

stemmer
14
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
Svarte 20/01/2014 kl. 03:56
kilden bruker

stemmer
6

I Swift:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Svarte 18/08/2016 kl. 10:36
kilden bruker

stemmer
5

Jeg elsker utvidelser når de gjøre koden renere:

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

        self.removePersistentDomainForName(domainName)
    }
}
Svarte 22/08/2016 kl. 22:33
kilden bruker

stemmer
5

Merk: Dette svaret har blitt oppdatert for Swift også.

Hva med å ha det på en linje?

Utvide @Christopher Rogers svaret - den aksepterte en.

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

og ja, en gang må du kanskje synchronizedet,

[[NSUserDefaults standardUserDefaults] synchronize];

Jeg har laget en metode for å gjøre dette,

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

Swift ?

Med raske sin enda mer enkelt.

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

Og bruk :

UserDefaults.clean()
Svarte 11/08/2015 kl. 06:02
kilden bruker

stemmer
5

Jeg fant dette:

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

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

Svarte 04/12/2014 kl. 18:33
kilden bruker

stemmer
2

Det er en bug eller hva, men det removePersistentDomainForNamefungerer ikke mens clearing alle NSUserDefaultsverdier.

Så, er bedre alternativ som å nullstille PersistentDomain, og at du kan gjøre via følgende måte:

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Svarte 09/03/2016 kl. 08:28
kilden bruker

stemmer
1

Alle ovennevnte svarene er svært relevant, men hvis noen fortsatt klarer å tilbakestille userdefaults for slettet app, så kan du tilbakestille innholdsinnstillingene for deg simulator, og det vil fungere.skriv bildebeskrivelse her

Svarte 16/10/2014 kl. 08:44
kilden bruker

stemmer
1

Utvider på @ Folse svar ... Jeg tror en mer korrekt gjennomføring vil være ...

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

... kaller NSUserDefault er persistentDomainForName: metode. Som docs staten, metoden "Returnerer en ordbok som inneholder nøkler og verdier i den angitte vedvarende domenet." Ringe dictionaryRepresentation: i stedet, vil returnere en ordbok som vil trolig omfatte andre innstillinger som det gjelder for et bredere omfang.

Hvis du trenger å filtrere ut noen av de verdiene som skal nullstilles, deretter gjentar nøklene er måten å gjøre det. Selvfølgelig, hvis du ønsker å bare nuke alle prefs for app uten hensyn, er da en av de andre metodene postet ovenfor den mest effektive.

Svarte 18/02/2014 kl. 01:42
kilden bruker

stemmer
0

Prøv dette, det fungerer for meg.

Eneste linje med kode

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
Svarte 01/03/2018 kl. 05:57
kilden bruker

stemmer
0

dersom søknaden innstillingen trenger reset er nsuserdefault for tilgang til mikrofonen (mitt tilfelle), er en enkel løsning svar fra Anthony McCormick ( iPhone - Slik aktiverer du applikasjonen tilgang til medier på enheten - ALAssetsLibraryErrorDomain Code = -3312 "Globalt nektet adgang" ).

på enheten, går du til Innstillinger> Generelt> Nullstill> Nullstill stedsadvarsler

Svarte 14/08/2014 kl. 23:15
kilden bruker

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