+[NSUserDefaults standardUserDefaults]
Uygulama ayarlarını saklamak için kullanıyorum . Bu yaklaşık bir düzine dize değerinden oluşur. Bu değerleri yalnızca varsayılan bir değere ayarlamak yerine kalıcı olarak silmek mümkün müdür?
+[NSUserDefaults standardUserDefaults]
Uygulama ayarlarını saklamak için kullanıyorum . Bu yaklaşık bir düzine dize değerinden oluşur. Bu değerleri yalnızca varsayılan bir değere ayarlamak yerine kalıcı olarak silmek mümkün müdür?
Yanıtlar:
Uygulamanın kalıcı etki alanını şu şekilde kaldırabilirsiniz:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
Swift 3 ve sonrasında:
if let bundleID = Bundle.main.bundleIdentifier {
UserDefaults.standard.removePersistentDomain(forName: bundleID)
}
Bu @samvermette'nin cevabına benzer, ancak biraz daha temiz IMO.
Bu kod varsayılan olarak kayıt etki alanına sıfırlanır:
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];
Başka bir deyişle, o removeObjectForKey
uygulamada kaydettiğiniz her bir anahtar için.
Bu Apple Geliştirici Forumları iş parçacığında Ken Thomases için kredi .
[NSUserDefaults resetStandardUserDefaults]
bunu yapmıyorsunuz benim ötesimde.
- kullanmayı denedin removeObjectForKey
mi?
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"defunctPreference"];
İşte Swift'in cevabı:
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!)
Geliştirirken buna ihtiyacınız varsa, simülatörünüzü de sıfırlayabilir ve tümünü silebilirsiniz NSUserDefaults
.
iOS Simülatörü -> İçeriği ve Ayarları Sıfırla ...
Simülatördeki tüm uygulamaları ve dosyaları da sileceğini unutmayın.
Swift'te:
let defaults = NSUserDefaults.standardUserDefaults()
defaults.dictionaryRepresentation().keys.forEach { defaults.removeObjectForKey($0) }
Not: Bu cevap Swift için de güncellendi.
Bir satırda kalmaya ne dersiniz?
Christopher Rogers'ın cevabı genişletiliyor - kabul edilen cevap.
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
ve evet, bazen ihtiyacınız olabilir synchronize
,
[[NSUserDefaults standardUserDefaults] synchronize];
Bunu yapmak için bir yöntem oluşturdum,
- (void) clearDefaults {
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];
[[NSUserDefaults standardUserDefaults] synchronize];
}
Swift ?
Hızlı ile daha da kolay.
extension UserDefaults {
class func clean() {
guard let aValidIdentifier = Bundle.main.bundleIdentifier else { return }
standard.removePersistentDomain(forName: aValidIdentifier)
standard.synchronize()
}
}
Ve kullanım :
UserDefaults.clean()
Kod temiz yaptıkları zaman uzantıları seviyorum:
extension NSUserDefaults {
func clear() {
guard let domainName = NSBundle.mainBundle().bundleIdentifier else {
return
}
self.removePersistentDomainForName(domainName)
}
}
Hızlı 5
extension UserDefaults {
func clear() {
guard let domainName = Bundle.main.bundleIdentifier else {
return
}
removePersistentDomain(forName: domainName)
synchronize()
}
}
Bunu buldum:
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 "{}"
Kaynak: https://gist.github.com/ZevEisenberg/5a172662cb576872d1ab
Bu bir hata ya da ne olursa olsun ama removePersistentDomainForName
tüm NSUserDefaults
değerleri temizlerken çalışmıyor .
Yani, daha iyi bir seçenek sıfırlamak PersistentDomain
ve aşağıdaki yolla yapabilmenizdir:
NSUserDefaults.standardUserDefaults().setPersistentDomain(["":""], forName: NSBundle.mainBundle().bundleIdentifier!)
@ Folse'nin cevabına genişleyerek ... Daha doğru bir uygulamanın olacağına inanıyorum ...
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];
}
... NSUserDefault'un persistentDomainForName: yöntemini çağırıyor. Dokümanlar durumu olarak, "Belirtilen kalıcı etki alanındaki anahtarları ve değerleri içeren bir sözlük döndürür" yöntemi. DictionaryRepresentation çağrısı: bunun yerine, daha geniş bir kapsam için geçerli olduğu için muhtemelen diğer ayarları içerecek bir sözlük döndürür.
Sıfırlanacak değerlerden herhangi birini filtrelemeniz gerekiyorsa, tuşları tekrarlamak bunu yapmanın yoludur. Açıkçası, sadece dikkate almadan uygulama için tüm tercihleri nuke istiyorsanız, o zaman yukarıda yayınlanan diğer yöntemlerden biri en verimli.
sıfırlama gerektiren uygulama ayarı mikrofona erişim için nsuserdefault ise (benim durumum), Anthony McCormick'ten basit bir çözüm ( Iphone - Cihazdaki medyaya uygulama erişimi nasıl etkinleştirilir? - ALAssetsLibraryErrorDomain Code = -3312 "Global reddedildi erişim" ).
cihazda Ayarlar> Genel> Sıfırla> Konum Uyarılarını Sıfırla'ya gidin.
Bunu dene, benim için çalışıyor.
Tek satırlık kod
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]];