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?
Zúčtovací NSUserDefaults
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.
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í.
Už jste vyzkoušeli použití - removeObjectForKey?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
Zde je odpověď na Swift:
let appDomain = NSBundle.mainBundle().bundleIdentifier!
NSUserDefaults.standardUserDefaults().removePersistentDomainForName(appDomain)
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.
NSDictionary *defaultsDictionary = [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
for (NSString *key in [defaultsDictionary allKeys]) {
[[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
}
V Swift:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Miluju rozšíření, když dělají čistší kód:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
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()
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
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!)
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.
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ší.
Zkuste to, je to práce pro mě.
Jeden řádek kódu
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
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













