2010-01-16 19 views
33

मेरे पास +(void)initialize विधि वाला एक ऐपडिलेगेट क्लास है जिसका उपयोग मैं कुछ डिफ़ॉल्ट पंजीकृत करने के लिए करता हूं। यहाँ कोड है कि मैं का उपयोग करें:मौजूदा मानों को ओवरराइट किए बिना NSUserDefaults का उपयोग करके उपयोगकर्ता डिफ़ॉल्ट को कैसे पंजीकृत करें?

+ (void)initialize { 
    NSDictionary *defaults = [NSDictionary dictionaryWithObjectsAndKeys:@"NO", @"fooKey", @"YES", @"barKey", nil]; 

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaults]; 
} 

मैं भी Preferences.xib जो चेक बॉक्स की जोड़ी (NSButton) वरीयताओं की है कि प्रदर्शन स्थिति रखती बनाया। वे NSUserDefaultsController से उसी कुंजी के साथ बाध्य हैं (इस मामले में fooKey और barKey)। प्रत्येक बार जब मैं एक ऐप लॉन्च करता हूं और "डिफ़ॉल्ट" बदलता हूं तो उन्हें अगले ऐप लॉन्च पर बहाल किया जाता है।

क्या पहले से ही मौजूदा मानों को ओवरराइट किए बिना "डिफ़ॉल्ट डिफ़ॉल्ट" पंजीकरण करने का कोई तरीका है? हो सकता है कि हर बार जब मैं ऐप बनाता हूं और लॉन्च करता हूं तो इसकी वरीयता फाइल को फिर से बनाया जा रहा है? हो सकता है कि मुझे NSUserDefaultsController से चेकबॉक्स को अनइंड करना चाहिए और प्राथमिकता विंडो नियंत्रक में कुछ कस्टम कोड के साथ स्वयं के मानों को बनाए रखना चाहिए?

मैं उपयोगकर्ता डिफ़ॉल्ट को बनाए रखने के लिए अपनी पसंद के कार्यान्वयन को सुनना चाहता हूं।

मैं -registerDefaults: के लिए मैक ओएस एक्स 10.6.2 और XCode 3.2.1

+0

सुनिश्चित करें चेक बॉक्स "साझा उपयोगकर्ता चूक नियंत्रक" करने के लिए, नियंत्रक कुंजी "मूल्यों", मॉडल कुंजी पथ "fooKey"/"barKey" बाध्य कर रहे हैं सुनिश्चित करें। अन्यथा आपका कोड मेरे लिए ठीक दिखता है। – Costique

+5

'@" नहीं "' एक बूलियन शाब्दिक नहीं है; यह "नहीं" शब्द के लिए एक स्ट्रिंग अक्षर है। आपको '[NSNumber numberWithBool: NO] 'का उपयोग करना चाहिए; अन्यथा, उपयोगकर्ता डिफ़ॉल्ट में मान Booleans नहीं होगा। –

+0

नहीं, वे नहीं होंगे, लेकिन अगर मैं उन्हें बूल के रूप में पढ़ता हूं - वे करेंगे। डैनियल एच स्टीनबर्ग की पुस्तक "कोको प्रोग्रामिंग" (pragprog.com) से उद्धरण: वास्तव में, जब आप शब्दकोश में BOOL डालते हैं तो आपको इतना स्पष्ट होने की आवश्यकता नहीं होती है। जब आप प्राथमिकताओं से पढ़ते हैं तो आप मान को YES या NO में स्ट्रिंग के रूप में पास कर सकते हैं और फिर भी इस मान से BOOL बना सकते हैं। – Eimantas

उत्तर

75

उपयोग कर रहा हूँ प्रलेखन से (जोर जोड़ा):

पंजीकरण डोमेन की सामग्री को डिस्क पर लिखी नहीं कर रहे हैं ; हर बार जब आपका एप्लिकेशन शुरू होता है तो आपको इस विधि को कॉल करने की आवश्यकता होती है। आप एप्लिकेशन की संसाधन निर्देशिका में एक प्लेलिस्ट फ़ाइल डाल सकते हैं और रजिस्टर डिफॉल्ट को कॉल कर सकते हैं: उस फ़ाइल से जो सामग्री आप पढ़ते हैं उसके साथ।

तो आपका कोड सही रास्ते पर था। इस प्रकार आप डिफ़ॉल्ट डिफ़ॉल्ट पंजीकृत करते हैं।

मैं आमतौर पर -applicationDidFinishLaunching: में इस का उपयोग करें:

// Load default defaults 
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Defaults" ofType:@"plist"]]]; 

एक plist का उपयोग करना आसान जोड़ सकते हैं और अपने अनुप्रयोग में चूक को बदलने के लिए है, और यह आप भी @"NO" एक मूल्य के रूप में उपयोग करने की गलती करने से रोकता है।

संपादित करें: स्विफ्ट 3 संस्करण:

UserDefaults.standard.register(defaults: NSDictionary(contentsOf: Bundle.main.url(forResource: "Defaults", withExtension: "plist")!)! as! [String : Any]) 
+0

जोहान - आंख खोलने वाले के लिए धन्यवाद। मैंने कॉल को दोबारा जांच लिया और ऐसा लगता है कि यह बयान के बिना काम करता है! – Eimantas

+0

क्या आपके "लोड डिफ़ॉल्ट डिफ़ॉल्ट" कोड ऊपर सेटिंग्स बंडल के साथ उपयोग किया जा सकता है? उदाहरण के लिए, क्या मैं अपने डिफ़ॉल्ट को प्रारंभ करने के लिए रूट.प्लिस्ट फ़ाइल का उपयोग कर सकता हूं? – Ricky

+0

हां, हालांकि आपके ऐप को लॉन्च करने से पहले आपके सेटिंग्स बंडल को लोड किया जा सकता है, फिर भी आप सेटिंग प्लिस्ट में प्रारंभिक डिफ़ॉल्ट सेट भी कर सकते हैं। '-registerDefaults:' विधि सेटिंग बंडल के माध्यम से वरीयताओं को ओवरराइड नहीं करेगा। –