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?
cevap
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.
Bu çözüm, removeVolatileDomainForName, düzey – macwasik
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
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.
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