2011-07-12 4 views
5

का उपयोग करते समय सेटिंग्स पढ़ने में समस्याएं होने पर मैं अपनी सेटिंग्स को प्रबंधित करने के लिए InAppSettingsKit मॉड्यूल का उपयोग कर रहा हूं।InAppSettingsKit

मैं इसे अपने प्रोजेक्ट में उस बिंदु पर शामिल कर सकता हूं जहां मैं एक सेटिंग पेज बना सकता हूं जो मेरी परियोजना के साथ सही तरीके से इंटरैक्ट करता है। मेरे पास रूट है। कृपया कहा कि मैं बदल सकता हूं और जब मैं पहली बार सिम्युलेटर पर अपना ऐप चलाता हूं तो मैं प्रतिबिंबित परिवर्तन देख सकता हूं।

हालांकि, मेरे जीवन के लिए, मैं अपने कोड के माध्यम से NSUserDefaults में सेटिंग्स तक नहीं पहुंच सकता। जब मैं नीचे कोड चलाता हूं तो मैं [NSUserDefaults standardUserDefaults] की सामग्री के माध्यम से लूप कर सकता हूं। हालांकि, मैं केवल सामान्य सेटिंग्स का एक समूह है कि मेरे plist फ़ाइल में सामान से संबंधित नहीं हैं को देखने के

NSUserDefaults* d = [NSUserDefaults standardUserDefaults]; 

NSDictionary* dict = [d dictionaryRepresentation]; 

NSString* descKey; 
NSString* descObject; 
NSString* classTypeForKey; 
NSString* classTypeForObject; 
id myObject; 

for (id key in dict) { 
    myObject = [dict objectForKey:key]; 
    classTypeForObject = [[myObject class] description]; 
    classTypeForKey = [[key class] description]; 
    descKey = [key description]; 
    descObject = [myObject description]; 
} 

तो जहां InAppSettingsKit सेटिंग्स डाल करता है? डॉक्टर [NSUserDefaults standardUserDefaults] में कहता है इसलिए मुझे नुकसान हुआ है।

उत्तर

6

मुझे लगता है कि आपकी समस्या अवधारणा की गलतफहमी पर निर्भर करती है। रूट.प्लिस्ट किसी भी सेटिंग्स को स्टोर नहीं करता है लेकिन यह परिभाषित करता है कि सेटिंग्स.एप और InAppSettingsKit आपके उपयोगकर्ता पर काम करता है डिफ़ॉल्ट।

जब आपका ऐप पहली बार लॉन्च होता है, तो कोई उपयोगकर्ता डिफ़ॉल्ट नहीं होता है। आमतौर पर, आप एक स्थिर userDefaults.plist अपने संसाधन से में पढ़कर उचित डिफ़ॉल्ट सेटिंग्स से आरंभ करते हैं:

// Load the default values for the user defaults 
NSString* pathToUserDefaultsValues = [[NSBundle mainBundle] 
             pathForResource:@"userDefaults" 
             ofType:@"plist"]; 
NSDictionary* userDefaultsValues = [NSDictionary dictionaryWithContentsOfFile:pathToUserDefaultsValues]; 

// Set them in the standard user defaults 
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsValues]; 
+0

+1 का उपयोग करने वाले लोगों के लिए उपयोगी है। मैं कुछ इसी तरह पोस्ट करने जा रहा था, लेकिन यह पहले से ही ऊपर था! आपको यह स्वीकार करना चाहिए :) – Sum

3

यह सब समझ बना रहा है अब। मैंने काम करने के लिए पिछले प्रयासों में डिफ़ॉल्ट पंजीकरण करने का प्रयास किया था, लेकिन मैंने सोचा कि मैं रूट.प्लिस्ट फ़ाइल का उपयोग करके ऐसा कर सकता हूं। लेकिन निश्चित रूप से रजिस्टर डिफॉल्ट विधियां स्ट्रिंग्सटेबल और वरीयता स्पेसिफाइजर्स की उच्च स्तरीय प्रविष्टियों को देखती हैं। ऑर्टविन को इंगित करने के लिए धन्यवाद।

तो, एक अलग उपयोगकर्ता Default.plist फ़ाइल बनाने के बजाय, मुझे निम्न कोड मिला जो root.plist फ़ाइल को मैन्युअल रूप से NSUserDefaults में डिफ़ॉल्ट रूप से जोड़ने के लिए पार्स करता है। मुझे याद नहीं है कि मुझे यह कहां मिला, लेकिन ऐसा लगता है कि यह अच्छी तरह से काम करता है। वहाँ कारण हैं, तो क्यों मैं इसे इस तरह से नहीं करना चाहिए, विस्तृत करने के लिए स्वतंत्र महसूस:

- (void)setDefaults { 

     //get the plist location from the settings bundle 
     NSString *settingsPath = [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Settings.bundle"]; 
     NSString *plistPath = [settingsPath stringByAppendingPathComponent:@"Root.plist"]; 

     //get the preference specifiers array which contains the settings 
     NSDictionary *settingsDictionary = [NSDictionary dictionaryWithContentsOfFile:plistPath]; 
     NSArray *preferencesArray = [settingsDictionary objectForKey:@"PreferenceSpecifiers"]; 

     //use the shared defaults object 
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

     //for each preference item, set its default if there is no value set 
     for(NSDictionary *item in preferencesArray) { 

      //get the item key, if there is no key then we can skip it 
      NSString *key = [item objectForKey:@"Key"]; 
      if (key) { 

       //check to see if the value and default value are set 
       //if a default value exists and the value is not set, use the default 
       id value = [defaults objectForKey:key]; 
       id defaultValue = [item objectForKey:@"DefaultValue"]; 
       if(defaultValue && !value) { 
        [defaults setObject:defaultValue forKey:key]; 
       } 
      } 
     } 

     //write the changes to disk 
     [defaults synchronize]; 
     } 
} 
+0

पहली नजर में कोड ठीक दिखता है।हालांकि यह काम नहीं करेगा यदि आपके पास बाल पैनल हैं जो अलग-अलग फ़ाइलों में निर्दिष्ट हैं, न कि 'रूट.प्लिस्ट'। –

+0

नोट करें कि आप उपरोक्त कोड – Sam

0

मैं ऊपर अपने ही सवाल करने के लिए स्टीव के जवाब संशोधन किया है और निम्नलिखित मेरे लिए काम करने लगता है:

में अपने IASKAppSettingsViewController subclass-

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 


    NSDictionary* settingsBundle = [self.settingsReader settingsBundle]; 
    NSArray *preferencesArray = [settingsBundle objectForKey:@"PreferenceSpecifiers"]; 
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 

    //for each preference item, set its default if there is no value set 
    for(NSDictionary *item in preferencesArray) { 

     //get the item key, if there is no key then we can skip it 
     NSString *key = [item objectForKey:@"Key"]; 
     if (key) { 

      //check to see if the value and default value are set 
      //if a default value exists and the value is not set, use the default 
      id value = [defaults objectForKey:key]; 
      id defaultValue = [item objectForKey:@"DefaultValue"]; 
      if(defaultValue && !value) { 
       [defaults setObject:defaultValue forKey:key]; 
      } 
     } 
    } 

    //write the changes to disk 
    [defaults synchronize]; 

}

2

मैं बच्चे के शीशे अलग फ़ाइलों में निर्दिष्ट प्रक्रिया करने के लिए सैम कोड संशोधित:

#import "IASKSettingsReader.h" 

- (void)initializeSettings 
{ 
    // standard stored preference values 
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 

    // settings files to process 
    NSMutableArray *preferenceFiles = [[NSMutableArray alloc] init]; 

    // begin with Root file 
    [preferenceFiles addObject:@"Root"]; 

    // as other settings files are discovered will be added to preferencesFiles 
    while (![preferenceFiles isEmpty]) { 

     // init IASKSettingsReader for current settings file 
     NSString *file = [[preferenceFiles lastObject] retain]; 
     [preferenceFiles removeLastObject]; 
     IASKSettingsReader *settingsReader = [[IASKSettingsReader alloc] 
               initWithFile:file]; 
     [file release]; 

     // extract preference specifiers 
     NSArray *preferenceSpecifiers = [[settingsReader settingsBundle] 
             objectForKey:kIASKPreferenceSpecifiers]; 

     // process each specifier in the current settings file 
     for (NSDictionary *specifier in preferenceSpecifiers) { 

      // get type of current specifier 
      NSString *type = [specifier objectForKey:kIASKType]; 

      // need to check child pane specifier for additional file 
      if ([type isEqualToString:kIASKPSChildPaneSpecifier]) { 
       [preferenceFiles addObject:[specifier objectForKey:kIASKFile]]; 
      } 
      else { 
       // check if current specifier has a default value 
       id defaultValue = [specifier objectForKey:kIASKDefaultValue]; 

       if (defaultValue) { 
        // get key from specifier and current stored preference value 
        NSString *key = [specifier objectForKey:kIASKKey]; 
        id value = [defaults objectForKey:key]; 

        // update preference value with default value if necessary 
        if (key && value == nil) { 
         [defaults setObject:defaultValue forKey:key];       
        } 
       } 
      } 

     } 

     [settingsReader release]; 
    } 

    [preferenceFiles release]; 

    // synchornize stored preference values 
    [defaults synchronize]; 
} 
+0

+1 में उपयुक्त प्राथमिकताएं प्राप्त करने के लिए '[[iaskSettingsViewController सेटिंग्स रीडर] सेटिंग्स बंडल] का उपयोग कर सकते हैं। बहुत अच्छा! मैंने एआरसी के लिए आपके कोड एकाउंटिंग में मामूली संशोधन पोस्ट किया। –

4

यहां ओजास कोड एआरसी के लिए थोड़ा आगे संशोधित है।

आप शायद अपने ऐपडिलेगेट से प्रारंभिक सेटिंग्स को कॉल करेंगे फिनिश लांचिंगविथऑप्शन।

#import "IASKSettingsReader.h" 
... 

- (void)initializeSettings 
{ 
    // standard stored preference values 
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 

    // settings files to process 
    NSMutableArray *preferenceFiles = [[NSMutableArray alloc] init]; 

    // begin with Root file 
    [preferenceFiles addObject:@"Root"]; 

    // as other settings files are discovered will be added to preferencesFiles 
    while ([preferenceFiles count] > 0) { 

     // init IASKSettingsReader for current settings file 
     NSString *file = [preferenceFiles lastObject]; 
     [preferenceFiles removeLastObject]; 
     IASKSettingsReader *settingsReader = [[IASKSettingsReader alloc] 
               initWithFile:file]; 

     // extract preference specifiers 
     NSArray *preferenceSpecifiers = [[settingsReader settingsBundle] 
             objectForKey:kIASKPreferenceSpecifiers]; 

     // process each specifier in the current settings file 
     for (NSDictionary *specifier in preferenceSpecifiers) { 

      // get type of current specifier 
      NSString *type = [specifier objectForKey:kIASKType]; 

      // need to check child pane specifier for additional file 
      if ([type isEqualToString:kIASKPSChildPaneSpecifier]) { 
       [preferenceFiles addObject:[specifier objectForKey:kIASKFile]]; 
      } 
      else { 
       // check if current specifier has a default value 
       id defaultValue = [specifier objectForKey:kIASKDefaultValue]; 

       if (defaultValue) { 
        // get key from specifier and current stored preference value 
        NSString *key = [specifier objectForKey:kIASKKey]; 
        id value = [defaults objectForKey:key]; 

        // update preference value with default value if necessary 
        if (key && value == nil) { 
         [defaults setObject:defaultValue forKey:key]; 
        } 
       } 
      } 

     } 

    } 

    // synchronize stored preference values 
    [defaults synchronize]; 
} 
+0

यह गिटहब https://github.com/futuretap/InAppSettingsKit/issues/68 पर पोस्ट की गई समस्या से संबंधित प्रतीत होता है –

1

मैंने @Ojas द्वारा दिए गए एक पर मेरा उत्तर आधारित किया है। लेकिन मैंने इसे स्विफ्ट में बदल दिया। मुझे उम्मीद है कि यह स्विफ्ट

func processDefaultSettings() { 

    let defaults = IASKSettingsStoreUserDefaults().defaults 

    // settings files to process 
    var preferenceFiles = [String]() 

    // begin with Root file 
    preferenceFiles.append("Root") 

    // as other settings files are discovered will be added to preferencesFiles 
    while !preferenceFiles.isEmpty { 

     // init IASKSettingsReader for current settings file 
     let file = preferenceFiles.last 
     let settingsReader = IASKSettingsReader(file: file) 
     preferenceFiles.removeLast() 

     // extract preference specifiers 
     if let preferenceSpecfiers = settingsReader.settingsDictionary[kIASKPreferenceSpecifiers] as? NSArray { 

      // process each specifier in the current settings file 
      for specifier in preferenceSpecfiers { 

       // get type of current specifier 
       let type = specifier[kIASKType] as! String 

       // need to check child pane specifier for additional file 
       if type == kIASKPSChildPaneSpecifier { 
        preferenceFiles.append(specifier[kIASKFile] as! String) 
       } 
       else { 
        // check if current specifier has a default value 
        if let defaultValue = specifier[kIASKDefaultValue] as AnyObject? { 

         // get key from specifier and current stored preference value 
         if let key = specifier[kIASKKey] as? String { 

          if let value = defaults.objectForKey(key) { 
           // Nothing to do - already set 
          } 
          else { 
           let appDefaults = [key: defaultValue] 
           defaults.registerDefaults(appDefaults) 
          } 
         } 
        } 
       } 
      } 
     } 
     // synchornize stored preference values 
     defaults.synchronize() 
    } 
}