2011-05-11 5 views
12

मैं NSUserDefaults में डिफ़ॉल्ट मान पंजीकृत करना चाहता हूं ताकि उपयोगकर्ता सेटिंग्स स्पष्ट रूप से उपयोगकर्ता द्वारा सेट किए गए मानों के लिए शून्य मान वापस न करें, बल्कि सेटिंग्स बंडल में निर्दिष्ट डिफ़ॉल्ट मानों को वापस कर दें। मैं यहाँ पढ़ें:मैं मोनो टच में डिफ़ॉल्ट कैसे पंजीकृत करूं?

How to register user defaults using NSUserDefaults without overwriting existing values?

निम्न applicationDidFinishLaunching में मार डाला जाना चाहिए:

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

यह कैसे MonoTouch में किया जा सकता?

उत्तर

2

आप की तर्ज पर कुछ कोशिश कर सकते: (! यह सोचते हैं आप में अपने सभी मूलभूत मूल्यों के साथ एक Defaults.plist फ़ाइल बना ली है (और यह अपने बंडल की जड़ में है))

NSUserDefaults.StandardUserDefaults.RegisterDefaults(NSDictionary.FromFile("Defaults.plist")); 

+0

धन्यवाद,:

public class CustomNSDictionary: NSDictionary { public CustomNSDictionary (IntPtr ptr): base(ptr) {} } 

तो आप निम्नलिखित के साथ समस्याग्रस्त लाइन बदल सकते हैं। मैंने थोड़ा अलग दृष्टिकोण लिया, लेकिन मुझे उस कोड का अनुवाद मिला जो मैंने उपयोगी पोस्ट किया था। – BruceHill

15

मैं विधि इस सवाल में दिए गए विवरण का उपयोग करके इस हल:

Can you make the settings in Settings.bundle default even if you don't open the Settings App

मैं मूल रूप से अनुवाद समारोह registe rdefaultsFromSettingsBundle मोनो टच में सूचीबद्ध है। यह एक बहुत ही उपयोगी फ़ंक्शन है क्योंकि यह सेटिंग बंडल में सूचीबद्ध डिफ़ॉल्ट मानों के लिए रजिस्टर डिफ़ॉल्ट को कॉल करता है। यह सुनिश्चित करता है कि यदि उपयोगकर्ता ने कोई मान दर्ज नहीं किया है, तो परिभाषित डिफ़ॉल्ट मान शून्य मानों के बजाय वापस किए जाएंगे। इसे AppDelegate के FinishedLaunching से बुलाया जा सकता है।

public static void RegisterDefaultsFromSettingsBundle() 
{ 
    string settingsBundle = NSBundle.MainBundle.PathForResource("Settings", @"bundle"); 
    if(settingsBundle == null) { 
     System.Console.WriteLine(@"Could not find Settings.bundle"); 
     return; 
    } 
    NSString keyString = new NSString(@"Key"); 
    NSString defaultString = new NSString(@"DefaultValue"); 
    NSDictionary settings = NSDictionary.FromFile(Path.Combine(settingsBundle,@"Root.plist")); 
    NSArray preferences = (NSArray) settings.ValueForKey(new NSString(@"PreferenceSpecifiers")); 
    NSMutableDictionary defaultsToRegister = new NSMutableDictionary(); 
    for (uint i=0; i<preferences.Count; i++) { 
     NSDictionary prefSpecification = new NSDictionary(preferences.ValueAt(i)); 
     NSString key = (NSString) prefSpecification.ValueForKey(keyString); 
     if(key != null) { 
      NSObject def = prefSpecification.ValueForKey(defaultString); 
      if (def != null) { 
       defaultsToRegister.SetValueForKey(def, key); 
      } 
     } 
    } 
    NSUserDefaults.StandardUserDefaults.RegisterDefaults(defaultsToRegister); 
} 

मुझे आशा है कि अन्य MonoTouch डेवलपर्स इस उपयोगी पाते हैं:

यहाँ इस समारोह के MonoTouch संस्करण है।

अद्यतन:

NSDictionary prefSpecification = new NSDictionary(preferences.ValueAt(i)); 

ध्यान दें कि यह अपवाद iOS 8 की वजह से, बल्कि इसलिए Xamarin बनाने का फैसला किया गया है नहीं होती है:

Xamarin.iOS के नवीनतम संस्करण के साथ इस कोड को इस लाइन पर एक अपवाद फेंक होगा कन्स्ट्रक्टर जो कोड निजी पर निर्भर करता है, इसलिए आवश्यक कन्स्ट्रक्टर का उपयोग करने के लिए उपलब्ध नहीं है। मैं NSDictionary इस तरह उपवर्गीकरण द्वारा इस का समाधान: ल्यूक

CustomNSDictionary prefSpecification = new CustomNSDictionary(preferences.ValueAt(i)); 
+0

स्निपेट के लिए बहुत उपयोगी, धन्यवाद! मैं plist को पढ़ने के लिए 'XDocument' का उपयोग कर रहा था। यह सिम्युलेटर पर काम करता था, लेकिन डिवाइस पर नहीं, क्योंकि प्लास्ट को बाइनरी प्रारूप में संकलित किया जाता है। आपका कोड सिम्युलेटर और डिवाइस दोनों पर एक आकर्षण की तरह काम करता है :) –

+0

आपका स्वागत है, नील्स। खुशी है कि आपको यह उपयोगी लगता है। :) – BruceHill

+0

क्या यह टिन पर क्या कहता है। इसे साझा करने के लिए आपको धन्यवाद! –