पर कॉल करें [NSUserDefaults registerDefaults:]
के माध्यम से पंजीकृत वरीयता मानों का गुच्छा एप्लिकेशन स्टार्टअप पर कॉल करें। मुझे उन्हें कुछ चरणों में नए लोगों के साथ बदलने की जरूरत है लेकिन नए मूल्यों का दायरा (कुंजी सेट) प्रारंभिक से कम है। तो मैं [NSUserDefaults registerDefaults:]
पर फिर से कॉल करने के बाद मेरे पास कुछ पुराने मूल्य हैं जो प्रतिस्थापित नहीं किए गए थे। क्या पहले पंजीकृत मूल्यों को हटाने की संभावना है?मैं पहले से पंजीकृत मान को कैसे हटा सकता हूं [NSUserDefaults रजिस्टर डिफ़ॉल्ट:]
उत्तर
NSRegistrationDomain
को हटाने के लिए आप removeVolatileDomainForName:
का उपयोग कर सकते हैं। यह registerDefaults:
के माध्यम से पंजीकृत सभी मानों को साफ़ करता है। लेकिन अगर आपको ऐसा करने की ज़रूरत है तो आप कुछ गलत कर रहे हैं। सही तरीके से set...:forKey:
विधियों में से किसी एक का उपयोग करके नई सेटिंग्स को स्टोर करना होगा।
यह समाधान हटाने के कारण मेरी समस्या को ठीक नहीं करेगा वोल्टाइलडोमेन फोरनाम डिफ़ॉल्ट + 1 चरण में स्तर + 1 चरण में काम करता है – macwasik
पंजीकृत डिफ़ॉल्ट को पूरी तरह से प्रतिस्थापित करने के लिए, आप NSRegistrationDomain
डोमेन (जो अस्थिर है, वैसे भी) को प्रतिस्थापित करेगा।
व्यक्तिगत पंजीकृत डिफ़ॉल्ट को हटाने के लिए, आपको NSRegistrationDomain
में मान प्राप्त होते हैं, अपमानजनक कुंजी को हटाते हैं, और डोमेन को प्रतिस्थापित करते हैं।
NSUserDefaults
पर एक वर्ग कुछ इस तरह दिख सकता है:
@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
प्रेरणा:
कारण मैं की जरूरत है इस वजह से मैं (3 पक्ष के संगतता के कारणों के लिए) turn on user-agent spoofing करना चाहते हैं। उपयोगकर्ता-एजेंट स्पूफ़िंग केवल तब काम करता है जब मान registerDefaults:
के माध्यम से सेट किया जाता है, इसलिए set...:forKey:
उपयोगकर्ता-एजेंट स्ट्रिंग को रोक नहीं देगा। अगर मैं कुछ समय बाद उपयोगकर्ता-एजेंट को स्पूफ करना बंद करना चाहता हूं (ऐप को पुनरारंभ किए बिना), मुझे डिफ़ॉल्ट को हटाने का एक तरीका चाहिए। इसके अलावा, मैं अपने ऐप उपयोगकर्ताओं के अन्य पंजीकृत डिफ़ॉल्ट को साफ़ नहीं करना चाहता हूं। उपरोक्त समाधान यह पूरी तरह से पूरा करने के लिए प्रतीत होता है।
स्विफ्ट 3 पोर्ट:
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)
}
}
डिफ़ॉल्ट उपयोगकर्ता एजेंट वापस मेरे ऐप पर बहाल करने के लिए मेरी UIWebView
की deinit
में प्रयुक्त।
यदि आप आईओएस पर काम कर रहे हैं, तो दस्तावेज़ (http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html) का उल्लेख है कि " पंजीकरण डोमेन की सामग्री डिस्क पर नहीं लिखी जाती है; आपको प्रत्येक बार अपना आवेदन शुरू होने पर इस विधि को कॉल करने की आवश्यकता होती है। आप एप्लिकेशन की संसाधन निर्देशिका में एक प्लेलिस्ट फ़ाइल डाल सकते हैं और रजिस्टर डिफॉल्ट्स को कॉल कर सकते हैं: उस फ़ाइल से जो सामग्री आप पढ़ते हैं उसके साथ। " तो मुझे लगता है कि, अगर आप उन्हें छोड़ देते हैं, तो वे खाली छोड़ दिए जाते हैं। क्या आपको कोई विचार है कि डिफ़ॉल्ट मान डिफ़ॉल्ट में क्यों छोड़े गए हैं? – Nick