NSUserDefaults rozliczeniowe

głosy
274

Używam +[NSUserDefaults standardUserDefaults]do przechowywania ustawień aplikacji. Ten składa się z wartości ciągu mniej więcej tuzin. Czy to możliwe, aby usunąć te wartości na stałe, a nie tylko ich ustawienia do wartości domyślnych?

Utwórz 13/02/2009 o 08:49
źródło użytkownik
W innych językach...                            


15 odpowiedzi

głosy
495

Można usunąć uporczywe domenę aplikacji tak:

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

W Swift 3 i później:

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

Jest to podobne do odpowiedzi przez @samvermette ale jest trochę czystsze IMO.

Odpowiedział 26/07/2011 o 03:55
źródło użytkownik

głosy
101

Ten kod resetuje ustawienia domyślne do rejestracji domeny:

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

Innymi słowy, removeObjectForKeydla każdego pojedynczego klawisza kiedykolwiek zarejestrowana w tej aplikacji.

Kredyty Ken Tomaszom na tej firmy Apple Forum Twórca wątku.

Odpowiedział 10/06/2010 o 05:40
źródło użytkownik

głosy
95

Czy spróbować użyć - removeObjectForKey?

 [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Odpowiedział 13/02/2009 o 08:51
źródło użytkownik

głosy
29

Oto odpowiedź w Swift:

let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Odpowiedział 15/04/2015 o 14:36
źródło użytkownik

głosy
27

Jeśli jest to potrzebne przy opracowywaniu, można również zresetować symulator, usuwanie wszystkich NSUserDefaults.

iOS Simulator -> Reset zawartość i ustawienia ...

Należy pamiętać, że będzie to również usunąć wszystkie aplikacje i pliki na symulatorze.

Odpowiedział 06/09/2011 o 15:54
źródło użytkownik

głosy
13
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
                    [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
Odpowiedział 20/01/2014 o 04:56
źródło użytkownik

głosy
6

W Swift:

let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Odpowiedział 18/08/2016 o 10:36
źródło użytkownik

głosy
5

Kocham rozszerzeń kiedy dokonać czyszczenia kodu:

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

        self.removePersistentDomainForName(domainName)
    }
}
Odpowiedział 22/08/2016 o 22:33
źródło użytkownik

głosy
5

Uwaga: Ta odpowiedź została zaktualizowana do Swift też.

Co mieć go w jednej linii?

Rozszerzanie @Christopher Rogers odpowiedź - akceptowany jeden.

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

i tak, kiedyś może trzeba synchronizenim,

[[NSUserDefaults standardUserDefaults] synchronize];

Utworzyłem sposób, aby to zrobić,

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

Swift ?

Z Swift jej jeszcze bardziej proste.

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

I użytkowanie :

UserDefaults.clean()
Odpowiedział 11/08/2015 o 06:02
źródło użytkownik

głosy
5

Znalazłem to:

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

Źródło: https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab

Odpowiedział 04/12/2014 o 18:33
źródło użytkownik

głosy
2

Jest to bug czy cokolwiek, ale removePersistentDomainForNamenie działa podczas usuwania wszystkich NSUserDefaultswartości.

Tak, lepszym rozwiązaniem jest to, aby zresetować PersistentDomaini że można to zrobić poprzez następujący sposób:

NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Odpowiedział 09/03/2016 o 08:28
źródło użytkownik

głosy
1

Wszystkie powyższe odpowiedzi są bardzo istotne, ale jeśli ktoś jeszcze w stanie zresetować userdefaults dla usuniętej aplikacji, można przywrócić ustawienia zawartości ciebie symulator, i będzie działać.wprowadzić opis obrazu tutaj

Odpowiedział 16/10/2014 o 09:44
źródło użytkownik

głosy
1

Rozwijając na odpowiedź @ folse za ... Wierzę bardziej prawidłowa realizacja byłaby ...

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

... nazywając NSUserDefault za persistentDomainForName: metody. Jako stan Dokumenty, metoda „Zwraca słownik zawierający klucze i wartości w określonym uporczywego domeny.” Wywołanie dictionaryRepresentation: zamiast, powróci do słownika, który prawdopodobnie będzie zawierać inne ustawienia, ponieważ odnosi się do szerszego zakresu.

Jeśli trzeba odfiltrować żadnej z wartości, które mają być kasowane, a następnie iteracji nad klawiszami jest sposób aby to zrobić. Oczywiście, jeśli chcesz po prostu nuke wszystkich preferencjach dla aplikacji niezależnie, wówczas jeden z pozostałych metod zamieszczonych powyżej jest najbardziej efektywne.

Odpowiedział 18/02/2014 o 02:42
źródło użytkownik

głosy
0

Spróbuj to, to działa na mnie.

Pojedyncza linia kodu

[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
Odpowiedział 01/03/2018 o 05:57
źródło użytkownik

głosy
0

Jeśli ustawienie aplikacji wymagających resetu jest nsuserdefault dostępu do mikrofonu (moim przypadku), prostym rozwiązaniem jest odpowiedź od Anthony McCormick ( iPhone - Jak umożliwić dostęp aplikacji do mediów na urządzeniu - Kodeks ALAssetsLibraryErrorDomain = -3312 „Global odmowa dostępu” ).

na urządzeniu, przejdź do Ustawienia> Ogólne> Wyzeruj> Położenie Ostrzeżenia

Odpowiedział 15/08/2014 o 00:15
źródło użytkownik

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