Sunt folosind +[NSUserDefaults standardUserDefaults]pentru a stoca setările aplicației. Aceasta constă din valori șir aproximativ o duzină. Este posibilă ștergerea acestor valori în permanență în loc să - i setarea la o valoare implicită?
NSUserDefaults Clearing
sursa de către utilizator TonyNeallon
În alte limbi...
Aveți posibilitatea să eliminați domeniul persistente aplicației ca aceasta:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
În Swift 3 și mai târziu:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
Acest lucru este similar cu răspunsul de @samvermette, dar este un pic mai curat OMI.
Acest cod resetează implicit la domeniul de înregistrare:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
Cu alte cuvinte, removeObjectForKeypentru fiecare cheie unică ați înregistrat vreodată în aplicația respectivă .
Credite Ken Thomases de pe acest Apple a Developer Forum thread.
Ai încercat utilizați - removeObjectForKey?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Aici este răspunsul în Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
Dacă aveți nevoie de ea în timp ce în curs de dezvoltare, puteți reseta , de asemenea , simulator de dvs., ștergând toate NSUserDefaults.
iOS Simulator -> Reset Conținut și setări ...
Țineți cont de faptul că va șterge, de asemenea, toate aplicațiile și fișierele de pe simulator.
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
În Swift:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Îmi place extensii atunci când fac curat codul:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
Notă: Acest răspuns a fost actualizat pentru Swift prea.
Ce zici să-l aibă pe o singură linie?
Extinderea răspunsului @Christopher Rogers - cel acceptat.
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
si da, uneori poate fi necesar să - synchronizel,
[[NSUserDefaults standardUserDefaults] synchronize];
Am creat o metodă de a face acest lucru,
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Swift ?
Cu rapidă său chiar mai ușor.
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return false }
self.standard.removePersistentDomain(forName: aValidIdentifier)
self.standard.synchronize()
}
}
Și utilizare :
UserDefaults.clean()
Am gasit asta:
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 "{}"
Sursa: https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab
Este un bug sau orice altceva , dar removePersistentDomainForNamenu este de lucru în timp de compensare toate NSUserDefaultsvalorile.
Deci, opțiune mai bună este că , pentru a reseta PersistentDomainși care le puteți face prin următorul mod:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
Toate răspunsurile de mai sus sunt foarte relevante, dar dacă cineva încă în imposibilitatea de a reseta userdefaults pentru aplicația șters, atunci puteți reseta setările de conținut ale tine simulator, și va funcționa.
Extinderea răspunsul @ folse lui ... cred că o punere în aplicare mai corectă ar fi ...
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];
}
... de asteptare NSUserDefault lui persistentDomainForName: metoda. Deoarece starea docs, metoda „Returnează un dicționar care conține cheile și valorile din domeniul specificat persistente.“ Apelarea dictionaryRepresentation: în schimb, va returna un dicționar care va include probabil alte setări care se aplică la un domeniu de aplicare mai larg.
Dacă aveți nevoie pentru a filtra oricare dintre valorile care urmează să fie resetat, atunci iterarea cheilor este modul de a face acest lucru. Evident, dacă doriți să bombardeze doar toate prefs pentru aplicația fără a ține seama, atunci una dintre celelalte metode postate mai sus este cel mai eficient.
Încercați acest lucru, este de lucru pentru mine.
Un singur rând de cod
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
dacă setarea de aplicare a fi nevoie de resetare este nsuserdefault pentru a avea acces la microfon (cazul meu), o soluție simplă este răspunsul de la Anthony McCormick ( Iphone - Cum de a permite accesul la aplicații media pe dispozitivul? - Cod ALAssetsLibraryErrorDomain = -3312 „Global refuzat accesul“ ).
pe dispozitiv, accesați Setări> General> Reset> Resetați avertismente locație