2011-01-24 23 views
7

Tengo un problema para recuperar los valores predeterminados del conjunto de configuraciones cuando se inicia por primera vez una aplicación. Todos los campos no multivalentes devuelven el valor predeterminado correctamente. Todos los campos multivalentes devuelven NULL. El código que estoy utilizando para recuperar el valor actual:Configuraciones de tipo multivalor agrupar campos siempre devuelve nulo

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *upt=[defaults objectForKey:@"upthreshold"]; 

la sección correspondiente de Root.plist es:

   <dict> 
        <key>Title</key> 
        <string>Update Threshold</string> 
        <key>Type</key> 
        <string>PSMultiValueSpecifier</string> 
        <key>Key</key> 
        <string>upthreshold</string> 
        <key>DefaultValue</key> 
        <string>15</string> 
        <key>Titles</key> 
        <array> 
          <string>2 km</string> 
          <string>5 km</string> 
          <string>10 km</string> 
          <string>15 km</string> 
          <string>25 km</string> 
          <string>50 km</string> 
          <string>75 km</string> 
          <string>100 km</string> 
          <string>150 km</string> 
          <string>250 km</string> 
          <string>500 km</string> 
          <string>1000 km</string> 
        </array> 
        <key>Values</key> 
        <array> 
          <string>2</string> 
          <string>5</string> 
          <string>10</string> 
          <string>15</string> 
          <string>25</string> 
          <string>50</string> 
          <string>75</string> 
          <string>100</string> 
          <string>150</string> 
          <string>250</string> 
          <string>500</string> 
          <string>1000</string> 
        </array> 
      </dict> 

yo esperaría que "15" volverían como el valor actual, ya que se establece en el valor predeterminado. ¿Se requiere algún procesamiento diferente para los campos de Multivalue? Como dije anteriormente, hay 6 campos anteriores que devuelven sus valores correctamente. Este campo y los siguientes 2 campos Multivalue no. Los campos multivalentes están todos definidos de la misma manera.

+0

Podría estar malinterpretando esto, pero parece que "umbral" es un valor para la clave "Clave", no una clave en sí misma. –

+0

Tengo todos los campos configurados de esta manera y cada ejemplo que he visto establece la "Clave" de esta manera y esa es la forma en que se refiere al campo cuando se hace una llamada a objectForKey. Creo que esto es correcto Si no, ¿cómo lo definirías? – mlewis54

+0

Siempre he tenido problemas con los valores predeterminados si aún no se ha visitado la página de configuración. Tiendo a detectar nil y hardcode un valor predeterminado en la aplicación. No es bonito, pero funciona :( – deanWombourne

Respuesta

21

Si el usuario no modificó el valor en la aplicación de configuración, no hay ninguna configuración. El valor predeterminado especificado en el paquete de configuración solo es el predeterminado para mostrar en la aplicación de configuración

tiene que registrar manualmente sus valores predeterminados. NSUserdefaults no usa los valores predeterminados del conjunto de configuraciones.
Use algo como esto, agréguelo al principio de su aplicación (antes de acceder a los valores de usuario).
Los Userdefaults registrados no se guardan en el disco o nada. Debes registrarlos cada vez que inicies la aplicación.

NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithObjectsAndKeys: 
             @"15", @"upthreshold", 
             nil]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults]; 
+0

Gracias. Eso fue todo un truco. Parece extraño que los valores predeterminados funcionen para los campos de valor único antes del cambio (nunca los configuré usando la aplicación de configuración). Parece contradictorio tener una valor predeterminado que no es realmente uno sin tener que configurarlo cada vez en la aplicación. Se quita algo de una función que reduce el tiempo de programación. De todos modos, gracias por la ayuda. – mlewis54

+0

Esta característica incorrecta no está relacionada con el tipo de valor, estoy teniendo el mismo problema con Booleanos (el valor predeterminado especificado es SÍ, pero [valores predeterminados boolForKey: ...] devuelve NO). – 18446744073709551615

+0

Me acabo de encontrar con este problema. Si hace 'registerDefaults' para una sola tecla, ¿cómo es diferente a simplemente configura el objeto para la clave dada? – Besi

1

Me acabo de encontrar con este problema y me pregunto por qué el paquete de configuración proporciona un valor por defecto, si este valor no se puede leer desde el NSUserDefaults.

creé una extensión rápida que hace lo siguiente:

  • leer el valor de una determinada clave
  • Si la clave no existe, no estableció un defecto y volver este valor predeterminado

Así puedo hacer esto:

NSUserDefaults.standardUserDefaults().settignsStringValue("MYPREFS_DOMAIN", defaultValue: "domain.com") 

esta es la extensión:

extension NSUserDefaults{ 

    func settingsBoolValue(key: String, defaultValue: Bool) -> Bool{ 
     // The case for Bool is different as it would return `false` when the key is not set. 
     if let v: AnyObject = self.objectForKey(key){ 
      // The boolean value exists 
     } else { 
      self.setObject(defaultValue, forKey: key) 
     } 

     return self.boolForKey(key) 
    } 

    func settingsStringValue(key: String, defaultValue: String) -> String{ 
     if let v = self.stringForKey(key){ 
      return v 
     } else { 
      self.setObject(defaultValue, forKey: key) 
      return defaultValue 
     } 
    } 
} 
Cuestiones relacionadas