2011-01-24 17 views
7

Ho un problema nel recuperare i valori predefiniti dal pacchetto delle impostazioni quando si avvia per la prima volta un'app. Tutti i campi non multivalore restituiscono correttamente il valore predefinito. Tutti i campi multivalore restituiscono NULL. Il codice che sto usando per recuperare il valore corrente:Impostazioni di tipo multivalore raggruppamento dei campi sempre restituito null

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

La sezione pertinente da Root.plist è:

   <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> 

Mi aspetterei che "15" sarebbero tornati come il valore attuale in quanto è impostato sul valore predefinito. È richiesta una diversa elaborazione per i campi multivalore? Come ho detto in precedenza, ci sono 6 campi precedenti a questo che restituiscono correttamente i loro valori. Questo campo e i seguenti 2 campi Multivalore no. I campi multivalore sono tutti definiti allo stesso modo.

+0

Potrei essere frainteso, ma sembra che "upthreshold" è un valore per la chiave "Chiave", non una chiave stessa. –

+0

Ho tutti i campi impostati in questo modo e ogni esempio che ho visto imposta la "Chiave" in questo modo e questo è il modo in cui si fa riferimento al campo quando si esegue una chiamata objectForKey. Penso che sia giusto. Se no, come lo definiresti? – mlewis54

+0

Ho sempre avuto problemi con i valori predefiniti se la pagina delle impostazioni non è stata ancora visitata. Tendo a rilevare nil e hardcode come predefinito nell'app. Non è bello ma funziona :( – deanWombourne

risposta

21

Se il valore non è stato modificato dall'utente nell'app delle impostazioni, non ci sono impostazioni. Il valore predefinito specificato nel pacchetto impostazioni è solo l'impostazione predefinita per la visualizzazione nell'app delle impostazioni

è necessario registrare manualmente i valori predefiniti. NSUserdefaults non utilizza i valori predefiniti dal pacchetto delle impostazioni.
Usa qualcosa di simile, aggiungilo all'inizio della tua app (prima di accedere a userdefaults).
Userdefaults registrati non vengono salvati su disco o altro. Devi registrarli ogni volta che avvii l'app.

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

Grazie. Questo ha fatto il trucco: sembra strano che i valori predefiniti funzionassero per i singoli campi valore prima della modifica (non li ho mai impostati usando l'app delle impostazioni). Sembra controintuitivo avere un valore predefinito che non è realmente uno senza doverlo impostare ogni volta nell'app. Tipo di toglie da una funzionalità che riduce i tempi di programmazione.Indipendentemente, grazie per l'aiuto. – mlewis54

+0

Questa disfunzione non è correlata al tipo di valore - I'm avere lo stesso problema con Booleans (l'impostazione predefinita predefinita è YES, ma [default boolForKey: ...] restituisce NO.) – 18446744073709551615

+0

Mi sono imbattuto in questo problema. Se si esegue "registerDefaults" per una sola chiave, in che modo è diverso da imposta semplicemente l'oggetto per la chiave data? – Besi

1

Ho appena incontrato questo problema e mi chiedo perché il fascio impostazioni fornisce un valore predefinito, se questo valore non può mai essere letto dal NSUserDefaults.

ho creato un'estensione rapida che fa il seguente:

  • leggere il valore per una data chiave
  • Se la chiave non esiste impostare un default e restituire il presente di default

Così posso fare questo:

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

questa è l'estensione:

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 
     } 
    } 
} 
Problemi correlati