2010-09-09 7 views
6

पर कॉल करें [NSUserDefaults registerDefaults:] के माध्यम से पंजीकृत वरीयता मानों का गुच्छा एप्लिकेशन स्टार्टअप पर कॉल करें। मुझे उन्हें कुछ चरणों में नए लोगों के साथ बदलने की जरूरत है लेकिन नए मूल्यों का दायरा (कुंजी सेट) प्रारंभिक से कम है। तो मैं [NSUserDefaults registerDefaults:] पर फिर से कॉल करने के बाद मेरे पास कुछ पुराने मूल्य हैं जो प्रतिस्थापित नहीं किए गए थे। क्या पहले पंजीकृत मूल्यों को हटाने की संभावना है?मैं पहले से पंजीकृत मान को कैसे हटा सकता हूं [NSUserDefaults रजिस्टर डिफ़ॉल्ट:]

+0

यदि आप आईओएस पर काम कर रहे हैं, तो दस्तावेज़ (http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/Reference/Reference.html) का उल्लेख है कि " पंजीकरण डोमेन की सामग्री डिस्क पर नहीं लिखी जाती है; आपको प्रत्येक बार अपना आवेदन शुरू होने पर इस विधि को कॉल करने की आवश्यकता होती है। आप एप्लिकेशन की संसाधन निर्देशिका में एक प्लेलिस्ट फ़ाइल डाल सकते हैं और रजिस्टर डिफॉल्ट्स को कॉल कर सकते हैं: उस फ़ाइल से जो सामग्री आप पढ़ते हैं उसके साथ। " तो मुझे लगता है कि, अगर आप उन्हें छोड़ देते हैं, तो वे खाली छोड़ दिए जाते हैं। क्या आपको कोई विचार है कि डिफ़ॉल्ट मान डिफ़ॉल्ट में क्यों छोड़े गए हैं? – Nick

उत्तर

0

NSRegistrationDomain को हटाने के लिए आप removeVolatileDomainForName: का उपयोग कर सकते हैं। यह registerDefaults: के माध्यम से पंजीकृत सभी मानों को साफ़ करता है। लेकिन अगर आपको ऐसा करने की ज़रूरत है तो आप कुछ गलत कर रहे हैं। सही तरीके से set...:forKey: विधियों में से किसी एक का उपयोग करके नई सेटिंग्स को स्टोर करना होगा।

+0

यह समाधान हटाने के कारण मेरी समस्या को ठीक नहीं करेगा वोल्टाइलडोमेन फोरनाम डिफ़ॉल्ट + 1 चरण में स्तर + 1 चरण में काम करता है – macwasik

12

पंजीकृत डिफ़ॉल्ट को पूरी तरह से प्रतिस्थापित करने के लिए, आप 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: उपयोगकर्ता-एजेंट स्ट्रिंग को रोक नहीं देगा। अगर मैं कुछ समय बाद उपयोगकर्ता-एजेंट को स्पूफ करना बंद करना चाहता हूं (ऐप को पुनरारंभ किए बिना), मुझे डिफ़ॉल्ट को हटाने का एक तरीका चाहिए। इसके अलावा, मैं अपने ऐप उपयोगकर्ताओं के अन्य पंजीकृत डिफ़ॉल्ट को साफ़ नहीं करना चाहता हूं। उपरोक्त समाधान यह पूरी तरह से पूरा करने के लिए प्रतीत होता है।

EthanB के मूल जवाब की
+0

संयोग से एक ही समस्या में चला गया। धन्यवाद! – jklp

+0

ग्रेट सामान। आपको इसे गिटहब पर रखना चाहिए। धन्यवाद! – Dennis

1

स्विफ्ट 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 में प्रयुक्त।

संबंधित मुद्दे

 संबंधित मुद्दे