clearing NSUserDefaults

stemmen
274

Ik gebruik +[NSUserDefaults standardUserDefaults]om applicatie-instellingen op te slaan. Deze bestaat uit ongeveer tien stringwaarden. Is het mogelijk om deze waarden definitief verwijderen in plaats van alleen het instellen van hen om een standaard waarde?

De vraag is gesteld op 13/02/2009 om 08:49
bron van user
In andere talen...                            


15 antwoorden

stemmen
495

U kunt hardnekkige het domein van de applicatie te verwijderen als volgt uit:

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

In Swift 3 en later:

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

Dit is vergelijkbaar met het antwoord van @samvermette maar is een beetje schoner IMO.

antwoordde op 26/07/2011 om 03:55
bron van user

stemmen
101

Deze code stelt de standaard de domeinregistratie:

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

Met andere woorden, removeObjectForKeyvoor elke toets die u ooit in die app geregistreerd.

Kredieten aan Ken Thomases op deze Apple Developer Forum thread.

antwoordde op 10/06/2010 om 05:40
bron van user

stemmen
95

Hebt u proberen met behulp - removeObjectForKey?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
antwoordde op 13/02/2009 om 08:51
bron van user

stemmen
29

Hier is het antwoord in Swift:

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
antwoordde op 15/04/2015 om 14:36
bron van user

stemmen
27

Als je het nodig hebt, terwijl het ontwikkelen, kunt u ook opnieuw uw simulator, het verwijderen van alle NSUserDefaults.

iOS Simulator -> Reset inhoud en instellingen ...

Houd in gedachten dat het ook alle apps en bestanden te verwijderen op simulator.

antwoordde op 06/09/2011 om 15:54
bron van user

stemmen
13
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
antwoordde op 20/01/2014 om 04:56
bron van user

stemmen
6

In Swift:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
antwoordde op 18/08/2016 om 10:36
bron van user

stemmen
5

Ik hou van extensions bij het maken van de code schoner:

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

        self.removePersistentDomainForName(domainName)
    }
}
antwoordde op 22/08/2016 om 22:33
bron van user

stemmen
5

Opmerking: Dit antwoord is bijgewerkt voor Swift ook.

Hoe zit het met om het op één lijn?

Uitbreiding van @Christopher Rogers antwoord - de aanvaarde één.

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

en ja, soms moet u synchronizehet,

[[NSUserDefaults standardUserDefaults] synchronize];

Ik heb een methode om dit te doen geschapen,

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

Swift ?

Met swift haar nog makkelijker.

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

En gebruik :

UserDefaults.clean()
antwoordde op 11/08/2015 om 06:02
bron van user

stemmen
5

Ik vond dit:

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

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

antwoordde op 04/12/2014 om 18:33
bron van user

stemmen
2

Het is een bug of wat dan ook, maar het removePersistentDomainForNamewerkt niet bij het wissen van alle NSUserDefaultswaarden.

Dus, een betere optie is dat de te resetten PersistentDomainen dat je kunt doen via de volgende wijze:

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
antwoordde op 09/03/2016 om 08:28
bron van user

stemmen
1

Alle bovenstaande antwoorden zijn zeer relevant, maar als iemand nog steeds niet in staat om de userdefaults opnieuw in te stellen voor verwijderde app, dan kunt u reset de inhoud instellingen van je simulator, en het zal werken.voer image beschrijving hier

antwoordde op 16/10/2014 om 09:44
bron van user

stemmen
1

Voortbouwend op antwoord @ Folse's ... Ik denk dat een meer correcte uitvoering zou zijn ...

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

... belt NSUserDefault's persistentDomainForName: methode. Naarmate de documenten staat, de methode "Geeft een woordenboek met daarin de sleutels en waarden in het opgegeven hardnekkige domein." Bellen dictionaryRepresentation: in plaats daarvan, zal een woordenboek dat zal waarschijnlijk ook andere instellingen zoals dit geldt voor een ruimer toepassingsgebied terugkeren.

Als u nodig hebt om te filteren op basis van de waarden die moeten worden gereset, dan itereren over de toetsen is de manier om het te doen. Uiteraard, als je wilt gewoon allemaal van de prefs voor de app nuke zonder rekening te houden, dan is een van de andere methoden geplaatst boven het meest efficiënt is.

antwoordde op 18/02/2014 om 02:42
bron van user

stemmen
0

Probeer dit, het werkt voor mij.

Maar één regel code

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
antwoordde op 01/03/2018 om 05:57
bron van user

stemmen
0

indien de aanvraag instelling nodig reset nsuserdefault voor de toegang tot de microfoon (mijn geval), een eenvoudige oplossing is het antwoord van Anthony McCormick ( iPhone - applicatie toegang tot de media op het apparaat in te schakelen -? ALAssetsLibraryErrorDomain Code = -3312 "Global toegang geweigerd" ).

op het apparaat, gaat u naar Instellingen> Algemeen> Stel opnieuw in> Herstel locatiewaarschuwingen

antwoordde op 15/08/2014 om 00:15
bron van user

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