Zúčtovací NSUserDefaults

hlasů
274

Já používám +[NSUserDefaults standardUserDefaults]k ukládání nastavení aplikace. To se skládá ze zhruba tuctu hodnoty řetězce. Je možné odstranit tyto hodnoty trvale ne jen nastavením na výchozí hodnotu?

Položena 13/02/2009 v 08:49
zdroj uživatelem
V jiných jazycích...                            


15 odpovědí

hlasů
495

Můžete odstranit přetrvávající doménu aplikace takto:

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

V Swift 3 a novější:

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

To je podobné odpovědi od @samvermette ale je trochu čistší IMO.

Odpovězeno 26/07/2011 v 03:55
zdroj uživatelem

hlasů
101

Tento kód nastaví výchozí hodnoty pro zápis do domény:

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

Jinými slovy, removeObjectForKeypro každý jednotlivý klíč, který nikdy zapsána do této aplikace.

Úvěry Ken Tomášové na Apple Developer Fórum nití.

Odpovězeno 10/06/2010 v 05:40
zdroj uživatelem

hlasů
95

Už jste vyzkoušeli použití - removeObjectForKey?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Odpovězeno 13/02/2009 v 08:51
zdroj uživatelem

hlasů
29

Zde je odpověď na Swift:

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Odpovězeno 15/04/2015 v 14:36
zdroj uživatelem

hlasů
27

Pokud to budete potřebovat při vývoji, můžete také resetovat simulátor, mazání všechno NSUserDefaults.

iOS simulátor -> Obnovit obsah a nastavení ...

Mějte na paměti, že to bude také odstranit všechny aplikace a soubory na simulátoru.

Odpovězeno 06/09/2011 v 15:54
zdroj uživatelem

hlasů
13
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
Odpovězeno 20/01/2014 v 04:56
zdroj uživatelem

hlasů
6

V Swift:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Odpovězeno 18/08/2016 v 10:36
zdroj uživatelem

hlasů
5

Miluju rozšíření, když dělají čistší kód:

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

        self.removePersistentDomainForName(domainName)
    }
}
Odpovězeno 22/08/2016 v 22:33
zdroj uživatelem

hlasů
5

Poznámka: Tato odpověď byla pro Swift aktualizováno taky.

Co to mít na jedné lince?

Rozšíření @Christopher Rogers odpověď - přijímané jeden.

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

a ano, někdy budete muset synchronizetom,

[[NSUserDefaults standardUserDefaults] synchronize];

Vytvořil jsem způsob, jak toho dosáhnout,

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

Swift ?

Díky rychlému jeho ještě snadné.

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

A použití :

UserDefaults.clean()
Odpovězeno 11/08/2015 v 06:02
zdroj uživatelem

hlasů
5

Našel jsem tohle:

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

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

Odpovězeno 04/12/2014 v 18:33
zdroj uživatelem

hlasů
2

Je to chyba, nebo cokoliv, ale removePersistentDomainForNamenefunguje a přelétnout všechny NSUserDefaultshodnoty.

Takže lepší variantou je, že reset PersistentDomaina že si můžete dělat přes to následujícím způsobem:

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Odpovězeno 09/03/2016 v 08:28
zdroj uživatelem

hlasů
1

Všechny výše uvedené odpovědi jsou velmi důležité, ale pokud někdo stále nedaří obnovit userdefaults za odstraněné aplikace, pak můžete obnovit nastavení obsahové vás simulátoru, a to bude fungovat.zadejte popis obrázku zde

Odpovězeno 16/10/2014 v 09:44
zdroj uživatelem

hlasů
1

Rozšiřování na odpověď @ Folse je ... Věřím, že přesnější provádění by bylo ...

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

... volá NSUserDefault je persistentDomainForName: metoda. Jako stav dokument, přičemž tento způsob „Vrací slovník obsahující klíče a hodnoty v zadaném přetrvávající domény.“ Volání dictionaryRepresentation: místo, vrátí slovník, který bude pravděpodobně zahrnovat i další nastavení, protože se vztahuje na širší rozsah.

Potřebujete-li odfiltrovat některé z hodnot, které se mají obnovit, pak iterace nad klávesami je způsob, jak to udělat. Je zřejmé, že pokud chcete jen atomovku všechny prefs pro aplikace bez ohledu, pak jeden z dalších způsobů výše vyslaných je nejúčinnější.

Odpovězeno 18/02/2014 v 02:42
zdroj uživatelem

hlasů
0

Zkuste to, je to práce pro mě.

Jeden řádek kódu

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
Odpovězeno 01/03/2018 v 05:57
zdroj uživatelem

hlasů
0

v případě, že nastavení aplikace potřebuje restart je nsuserdefault pro přístup k mikrofonu (můj případ), je jednoduchým řešením odpověď od Anthony McCormick ( iPhone - Jak povolit přístup k aplikacím k médiím na přístroji? - ALAssetsLibraryErrorDomain Code = -3312 „Globální přístup odepřen“ ).

na zařízení, přejděte do Nastavení> Obecné> Obnovit> Obnovit varování o poloze

Odpovězeno 15/08/2014 v 00:15
zdroj uživatelem

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