Używam +[NSUserDefaults standardUserDefaults]
do przechowywania ustawień aplikacji. Składa się z około kilkunastu wartości ciągów. Czy można trwale usunąć te wartości zamiast po prostu ustawiając je na wartość domyślną?
Używam +[NSUserDefaults standardUserDefaults]
do przechowywania ustawień aplikacji. Składa się z około kilkunastu wartości ciągów. Czy można trwale usunąć te wartości zamiast po prostu ustawiając je na wartość domyślną?
Odpowiedzi:
Możesz usunąć trwałą domenę aplikacji w następujący sposób:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
W Swift 3 i nowszych:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
Jest to podobne do odpowiedzi @samvermette, ale jest trochę czystsze IMO.
Ten kod resetuje wartości domyślne do domeny rejestracji:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
Innymi słowy, removeObjectForKey
dla każdego klucza zarejestrowanego w tej aplikacji.
Podziękowania dla Kena Thomasesa w tym wątku na forach programistów Apple .
[NSUserDefaults resetStandardUserDefaults]
tego nie zrobię, to przede mną.
Próbowałeś użyć - removeObjectForKey
?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Oto odpowiedź w Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(NSBundle.mainBundle().bundleIdentifier!)
one-liner
if let domainName = NSBundle.mainBundle().bundleIdentifier { NSUserDefaults.standardUserDefaults().removePersistentDomainForName(domainName) }
UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
Jeśli potrzebujesz go podczas programowania, możesz również zresetować symulator, usuwając wszystkie NSUserDefaults
.
Symulator iOS -> Resetuj zawartość i ustawienia ...
Pamiętaj, że spowoduje to również usunięcie wszystkich aplikacji i plików z symulatora.
W Swift:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Uwaga: Ta odpowiedź została również zaktualizowana dla Swift.
Co powiesz na to, aby mieć go w jednej linii?
Rozszerzenie odpowiedzi na @Christopher Rogers - zaakceptowana.
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
i tak, czasami może być to synchronize
konieczne,
[[NSUserDefaults standardUserDefaults] synchronize];
Stworzyłem metodę, aby to zrobić,
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Szybki ?
Dzięki swift jest jeszcze łatwiejszy.
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
standard.removePersistentDomain(forName: aValidIdentifier)
standard.synchronize()
}
}
I użycie :
UserDefaults.clean()
Uwielbiam rozszerzenia, gdy czynią kod czystszym:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
Szybki 5
extension UserDefaults {
func clear() {
guard let domainName = Bundle.main.bundleIdentifier else {
return
}
removePersistentDomain(forName: domainName)
synchronize()
}
}
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
Jest to błąd lub cokolwiek innego, ale removePersistentDomainForName
nie działa podczas usuwania wszystkich NSUserDefaults
wartości.
Lepszą opcją jest zresetowanie PersistentDomain
i można to zrobić w następujący sposób:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Rozwijając odpowiedź @ folse ... Wierzę, że poprawniejsze wdrożenie byłoby ...
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];
}
... wywołanie metody persistentDomainForName: NSUserDefault. Zgodnie ze stanem dokumentacji metoda „Zwraca słownik zawierający klucze i wartości w określonej trwałej domenie”. Wywołanie słownika Reprezentacja: zamiast tego zwróci słownik, który prawdopodobnie będzie zawierał inne ustawienia, ponieważ dotyczy szerszego zakresu.
Jeśli musisz odfiltrować dowolną z wartości, które mają zostać zresetowane, możesz to zrobić iteracyjnie po klawiszach. Oczywiście, jeśli chcesz po prostu zrezygnować z wszystkich prefiksów aplikacji, bez względu na to, jedna z pozostałych metod wymienionych powyżej jest najbardziej wydajna.
jeśli ustawienie aplikacji wymagające zresetowania to nsuserdefault w celu uzyskania dostępu do mikrofonu (moja sprawa), prostym rozwiązaniem jest odpowiedź Anthony'ego McCormicka ( Iphone - Jak włączyć dostęp aplikacji do multimediów na urządzeniu? - ALAssetsLibraryErrorDomain Code = -3312 „Global odmowa dostępu” ).
na urządzeniu wybierz Ustawienia> Ogólne> Resetuj> Resetuj ostrzeżenia o lokalizacji
Spróbuj tego, działa dla mnie.
Pojedyncza linia kodu
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];