2010-09-09 10 views
6

Başvuru başlangıcında [NSUserDefaults registerDefaults:] numaralı çağrı yoluyla kayıtlı tercih değerlerim var. Onları yeni bir aşamada yenileriyle değiştirmem gerekiyor, ancak yeni değerler kapsamı (anahtar kümesi) ilk listeden daha az. Bu yüzden, [NSUserDefaults registerDefaults:] numaralı telefonu aradıktan sonra, bazı eski değiştirilmiş olan yeni değerlere sahibim. Önceden kayıtlı değerleri kaldırmak için bir olasılık var mı?Önceden [NSUserDefaults registerDefaults:] çağrısı ile kaydedilen değeri nasıl silebilirim?

+0

iOS'ta çalışıyorsanız, dokümanlar (http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html) " Kayıt etki alanı içeriği diske yazılmaz, uygulamanız her başladığında bu yöntemi çağırmanız gerekir.Programın Kaynaklar dizinine bir plist dosyası yerleştirebilir ve registerDefaults: Bu dosyadan okuduğunuz içeriğe çağrı yapabilirsiniz. " Öyleyse, eğer onları terk ederseniz boş kalırlar. Eski değerlerin neden varsayılanlarda kaldığına dair bir fikrin var mı? – Nick

cevap

0

NSRegistrationDomain ürününü kaldırmak için removeVolatileDomainForName:'u kullanabilirsiniz. Bu, registerDefaults: aracılığıyla kaydedilen tüm değerleri temizler. Fakat bunu yapman gerekiyorsa, büyük ihtimalle yanlış bir şey yapıyorsunuz demektir. Doğru yolu, set...:forKey: yöntemlerinden birini kullanarak yeni ayarları gerçekten depolamak olacaktır.

+0

Bu çözüm, removeVolatileDomainForName, düzey – macwasik

12

Kayıtlı varsayılanları tamamen değiştirmek için, NSRegistrationDomain etki alanını değiştirirsiniz (bu arada, bu da).

, sen NSRegistrationDomain değerleri almak, bireysel kayıtlı varsayılan kaldırmak kusurlu anahtar (lar) kaldırmak ve etki alanını değiştirmek için.

NSUserDefaults A kategorisi şöyle görünebilir:

@implementation NSUserDefaults (UnRegisterDefaults) 

- (void)unregisterDefaultForKey:(NSString *)defaultName { 
    NSDictionary *registeredDefaults = [[NSUserDefaults standardUserDefaults] volatileDomainForName:NSRegistrationDomain]; 
    if ([registeredDefaults objectForKey:defaultName] != nil) { 
     NSMutableDictionary *mutableCopy = [NSMutableDictionary dictionaryWithDictionary:registeredDefaults]; 
     [mutableCopy removeObjectForKey:defaultName]; 
     [self replaceRegisteredDefaults:[mutableCopy copy]]; 
    } 
} 

- (void)replaceRegisteredDefaults:(NSDictionary *)dictionary { 
    [[NSUserDefaults standardUserDefaults] setVolatileDomain:dictionary forName:NSRegistrationDomain]; 
} 

@end 

Motivasyon:

Ben (3. taraf uyumluluk nedenleriyle) turn on user-agent spoofing istiyorum çünkü bu ihtiyaç sebep. Kullanıcı-aracı sahteciliği, yalnızca değer registerDefaults: aracılığıyla ayarlandığında işe yarar görünüyor, bu nedenle set...:forKey:, kullanıcı aracısını dizgeyi durduramaz. Bir süre sonra kullanıcı aracısının sahteciliğini durdurmak istiyorsanız (uygulamayı yeniden başlatmadan), varsayılanları kaldırmanın bir yoluna ihtiyacım var. Ayrıca, uygulama kullanıcılarımın diğer kayıtlı varsayılanlarını temizlemek istemiyorum. Yukarıdaki çözüm, bunu mükemmel şekilde yerine getiriyor gibi görünüyor. EthanB orijinal cevabın

+0

varsayılan düzeyden daha yüksek düzeydeki çalışmalardan dolayı sorunumu düzeltmez Tesadüfen aynı soruna rastladı. Teşekkürler! – jklp

+0

Harika şeyler. Bunu GitHub'a koymalısın. Teşekkürler! – Dennis

1

Swift 3 bağlantı noktası:

extension UserDefaults { 
    /// Unregisters a value set in the UserDefaults.registrationDomain, if it exists 
    func unregister(defaultsFor key: String) { 
     var registeredDefaults = volatileDomain(forName: UserDefaults.registrationDomain) 
     registeredDefaults[key] = nil 
     setVolatileDomain(registeredDefaults, forName: UserDefaults.registrationDomain) 
    } 
} 

geri Uygulamama varsayılan kullanıcı aracısı geri benim UIWebView arasında deinit kullanılır.