2011-06-09 12 views
20

He creado un proyecto que establece y recupera valores de settings.bundle. También he establecido algunos valores predeterminados en el archivo settings.bundle. Ahora el problema es cuando puedo recuperar valores comoCómo recuperar valores de settings.bundle en el objetivo c?

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

por primera vez se muestra nula, pero los valores de conseguir el sistema de configuración de la aplicación para el iPhone. Si cambio los valores o los configuro manualmente, los valores se recuperan correctamente.

me ayude

Respuesta

35

Aunque se definen los parámetros predefinidos, que no son realmente almacena como un valor. Se almacenan por defecto. Si intenta leerlo, el valor es nulo. La configuración predeterminada es otra propiedad como valor. Pero eso no significa que escribirá el valor predeterminado como predeterminado.

Lo que hago es, primero, verificar si alguna configuración, (que estoy seguro de que debería tener un valor) tiene algo almacenado en ella. Si no tiene nada, escribo todos los valores predeterminados.

Aquí hay un ejemplo.

en AppDelegate.m Verifico si email_notificaciones_preference tiene un valor, si no, escribo TODAS las configuraciones predeterminadas para cada configuración.

- (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]; 
    } 

} 

Esta función es la que uso para escribir valores predeterminados para cada elemento.

#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]; 

} 

Espero que ayude.

+0

Gracias para guardar un montón de tiempo! –

+0

Muy buena solución - Lo traduje a Swift y lo agregué como respuesta si alguien lo necesita. – Compufreak

+0

¿Debe '' [[NSUserDefaults standardUserDefaults] sincronizar]; 'también se agregará? –

0

probar esto

Para registrar valores por defecto de los paquetes de ajuste

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

Antes de recuperar valores de ajuste haces de sincronizar los datos

[[NSUserDefaults standardUserDefaults] synchronize] 
5

Si alguien lo necesita - traduje la respuesta de MIQUEL a Swift (lo mejor que pude ya que todavía estoy aprendiendo):

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

Y el registerDefaultsFromSettingsBundle func:

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

Versión actualizada para SWIFT 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

¿Algo para Swift 3? – Jonny

3

Actualización de Swift 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") 
    } 
}