2011-06-09 13 views
20

मैंने एक प्रोजेक्ट बनाया है जो सेटिंग्स से संबंधित मान सेट और पुनर्प्राप्त करता है। बंडल। मैंने सेटिंग्स में कुछ डिफ़ॉल्ट मान भी सेट किए हैं। बंडल फ़ाइल। अब समस्या यह है कि जब मैंउद्देश्य सी में सेटिंग्स.बंडल से मूल्य कैसे प्राप्त करें?

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
loginName.text = [defaults objectForKey:@"login_name"]; 

पहली बार शून्य दिखाता है, लेकिन मूल्य आईफोन एप्लिकेशन सेटिंग्स में सेट हो जाते हैं। यदि मैं मानों को बदलता हूं या इसे मैन्युअल रूप से सेट करता हूं, तो मान ठीक से पुनर्प्राप्त किए जाते हैं।

बाहर

उत्तर

35

यद्यपि आप चूक सेटिंग्स को परिभाषित मदद मुझे, वे वास्तव में एक मूल्य के रूप में जमा नहीं कर रहे हैं। वे डिफ़ॉल्ट रूप से संग्रहीत हैं। यदि आप इसे पढ़ने का प्रयास करते हैं, तो मान शून्य है। डिफ़ॉल्ट सेटिंग एक और संपत्ति है क्योंकि मान है। लेकिन इसका मतलब यह नहीं है कि डिफ़ॉल्ट मान डिफ़ॉल्ट रूप से लिखेंगे।

मैं क्या करता हूं, पहले, जांच करें कि कुछ सेटिंग है, (मुझे यकीन है कि इसमें कोई मूल्य होना चाहिए) उस पर कुछ भी संग्रहीत है। यदि उसके पास कुछ भी नहीं है तो मैं सभी डिफ़ॉल्ट लिखता हूं।

यहां एक उदाहरण है।

AppDelegate.m पर मैं जांचता हूं कि ईमेल_notificaciones_preference का मान है, यदि नहीं, तो मैं प्रत्येक सेटिंग में सभी डिफ़ॉल्ट सेटिंग्स लिखता हूं।

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    NSUserDefaults * standardUserDefaults = [NSUserDefaults standardUserDefaults]; 
    NSString * email_notificaciones_preference = [standardUserDefaults objectForKey:@"email_notificaciones_preference"]; 
    if (!email_notificaciones_preference) { 
     [self registerDefaultsFromSettingsBundle]; 
    } 

} 

यह फ़ंक्शन वह है जो मैं प्रत्येक तत्व के लिए डिफ़ॉल्ट लिखने के लिए उपयोग करता हूं।

#pragma NSUserDefaults 
- (void)registerDefaultsFromSettingsBundle { 
    // this function writes default settings as settings 
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings" ofType:@"bundle"]; 
    if(!settingsBundle) { 
     NSLog(@"Could not find Settings.bundle"); 
     return; 
    } 

    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle stringByAppendingPathComponent:@"Root.plist"]]; 
    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"]; 

    NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]]; 
    for(NSDictionary *prefSpecification in preferences) { 
     NSString *key = [prefSpecification objectForKey:@"Key"]; 
     if(key) { 
      [defaultsToRegister setObject:[prefSpecification objectForKey:@"DefaultValue"] forKey:key]; 
      NSLog(@"writing as default %@ to the key %@",[prefSpecification objectForKey:@"DefaultValue"],key); 
     } 
    } 

    [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsToRegister]; 

} 

आशा है कि मदद करता है।

+0

बहुत समय की बचत के लिए धन्यवाद! –

+0

बहुत अच्छा समाधान - मैंने इसे स्विफ्ट में अनुवादित किया और अगर किसी को इसकी आवश्यकता हो तो इसे उत्तर के रूप में जोड़ा गया। – Compufreak

+0

'[[NSUserDefaults standardUserDefaults] सिंक्रनाइज़ करना चाहिए];' भी जोड़ा जाना चाहिए? –

0

इस

स्थापना बंडलों

NSDictionary *appDefaults = [NSDictionary dictionaryWithObject:defaultValue forKey:@"key"]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:appDefaults]; 

के मूलभूत मूल्यों को पंजीकृत करने की कोशिश पुन: प्राप्त करने की स्थापना बंडलों मान डेटा

[[NSUserDefaults standardUserDefaults] synchronize] 
5

सिंक्रनाइज़ करने से पहले अगर कोई यह की जरूरत है - मैं MIQUEL से का जवाब अनुवाद स्विफ्ट (जैसा कि मैं अभी भी सीख रहा हूं उतना अच्छा):

var standardUserDefaults = NSUserDefaults.standardUserDefaults() 
var us: AnyObject? = standardUserDefaults.objectForKey("your_preference") 
if us==nil { 
    self.registerDefaultsFromSettingsBundle(); 
} 

और समारोह registerDefaultsFromSettingsBundle:

func registerDefaultsFromSettingsBundle() { 
    // this function writes default settings as settings 
    var settingsBundle = NSBundle.mainBundle().pathForResource("Settings", ofType: "bundle") 
    if settingsBundle == nil { 
     NSLog("Could not find Settings.bundle"); 
     return 
    } 
    var settings = NSDictionary(contentsOfFile:settingsBundle!.stringByAppendingPathComponent("Root.plist"))! 
    var preferences: [NSDictionary] = settings.objectForKey("PreferenceSpecifiers") as [NSDictionary]; 
    var defaultsToRegister = NSMutableDictionary(capacity:(preferences.count)); 

    for prefSpecification:NSDictionary in preferences { 
     var key: NSCopying? = prefSpecification.objectForKey("Key") as NSCopying? 
     if key != nil { 
      defaultsToRegister.setObject(prefSpecification.objectForKey("DefaultValue")!, forKey: key!) 
     } 
    } 
    NSUserDefaults.standardUserDefaults().registerDefaults(defaultsToRegister); 
} 
4

अद्यतन संस्करण तेज 2.1 के लिए:

func registerDefaultsFromSettingsBundle() { 
    let userDefaults = NSUserDefaults.standardUserDefaults() 

    if let settingsURL = NSBundle.mainBundle().URLForResource("Root", withExtension: "plist", subdirectory: "Settings.bundle"), 
      settings = NSDictionary(contentsOfURL: settingsURL), 
      preferences = settings["PreferenceSpecifiers"] as? [NSDictionary] { 

     var defaultsToRegister = [String: AnyObject]() 
     for prefSpecification in preferences { 
      if let key = prefSpecification["Key"] as? String, 
        value = prefSpecification["DefaultValue"] { 

       defaultsToRegister[key] = value 
       NSLog("registerDefaultsFromSettingsBundle: (\(key), \(value)) \(value.dynamicType)") 
      } 
     } 

     userDefaults.registerDefaults(defaultsToRegister); 
    } else { 
     NSLog("registerDefaultsFromSettingsBundle: Could not find Settings.bundle"); 
    } 
} 
+0

स्विफ्ट 3 के लिए कुछ भी? – Jonny

3

स्विफ्ट 3 के लिए अपडेट किया गया:

func registerDefaultsFromSettingsBundle() { 

    let userDefaults = UserDefaults.standard 

    if let settingsURL = Bundle.main.url(forResource: "Root", withExtension: "plist", subdirectory: "Settings.bundle"), 
     let settings = NSDictionary(contentsOf: settingsURL), 
     let preferences = settings["PreferenceSpecifiers"] as? [NSDictionary] { 

     var defaultsToRegister = [String: AnyObject]() 
     for prefSpecification in preferences { 
      if let key = prefSpecification["Key"] as? String, 
       let value = prefSpecification["DefaultValue"] { 

       defaultsToRegister[key] = value as AnyObject 
       debugPrint("registerDefaultsFromSettingsBundle: (\(key), \(value)) \(type(of: value))") 
      } 
     } 

     userDefaults.register(defaults: defaultsToRegister) 

    } else { 
     debugPrint("registerDefaultsFromSettingsBundle: Could not find Settings.bundle") 
    } 
} 
संबंधित मुद्दे