2016-06-15 16 views
13

Ho un interruttore chiamato SoundSwitch, sto salvando lo stato del pulsante utilizzando un utente predefinito come tale:Swift - Come impostare il valore iniziale per NSUserDefaults

@IBAction func soundsChanged(sender: AnyObject) { 
     if soundSwitch.on{ 
      defaults.setBool(true, forKey: "SoundActive") 
      print("Sound ON") 
     }else{ 
      defaults.setBool(false, forKey: "SoundActive") 
      print("Sound OFF") 
     } 
    } 

Attualmente il valore effettivo di default è inizialmente falsa quando l'utente prima lancia l'applicazione.

Come implementare i valori predefiniti in modo che siano vere se l'utente avvia per la prima volta l'app e non è stata ancora configurata.

Ho visto metodi in Objective-C, ma niente in Swift. Da quello che ho visto puoi farlo nell'app delegare un po 'come, o in un file plist. Come posso fare uno di quelli?

+0

Nell'appDelegate è possibile verificare se valueForKey è nullo. Se è nullo, puoi impostarlo su boolean true – Dominic

+0

vedere: http://iosdevcenters.blogspot.com/2016/05/save-data-using-nsuserdefaults-in-swift.html –

risposta

3

Non c'è nulla di specifico del delegato rapido o dell'app.

Le impostazioni iniziali vengono impostate chiamando registerDefaults: nell'istanza standardUserDefaults.

È possibile effettuare questa chiamata più volte e si consiglia di non farlo nel delegato dell'app, invece registrare i dettagli appropriati in momenti appropriati nell'app, quindi se si dispone di 1 vista controller/sottosistema che utilizza alcuni valori di default quindi registrano i valori predefiniti come parte dell'inizializzazione se quel codice.

Solo se si dispone di qualcosa che viene utilizzato da più parti diverse del codice, si dovrebbe considerare di farlo nel delegato dell'app e quindi solo se non si dispone di un altro controller appropriato in cui eseguirlo.

+0

Perché non lo fai? il delegato dell'app? – Daniel

+1

perché il delegato dell'app è presente per uno scopo specifico e la registrazione predefinita dell'utente arbitrario non fa parte di tale scopo @simpleBob: essendo il delegato dell'applicazione e la gestione degli eventi a livello di applicazione, nient'altro – Wain

+0

Tuttavia, la registrazione dei valori predefiniti dell'utente deve essere eseguita prima qualsiasi altra cosa, ecco perché 'didFinishLaunchingWithOptions' sarebbe un posto piuttosto ovvio ed è dove si trova nella maggior parte dei progetti. Inoltre, penso che sia meglio avere tutti i valori predefiniti in un posto piuttosto che avere più "registerDefaults" sull'intero progetto. – Daniel

0

Se davvero si vuole fare in questo modo, mettere questo nel AppDelegate:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    let defaults = NSUserDefaults.standardUserDefaults() 
    if defaults.valueForKey("SoundActive") == nil { 
     defaults.setBool(true, forKey: "SoundActive") 
    } 

se è solo usato in quello viewcontroller, considerano mettere il codice nel metodo viewDidLoad invece!

+0

Non penso che sia un buon modo, perché ogni volta che lanciavo l'app, eseguiva questi codici. Ma in realtà, è necessario solo alla prima volta. –

+0

OK, lo modifichi. Ma penso che il posto migliore sia quando usi il valore di "SoundActive", se poi è nullo vero. –

1
func lastStatus() -> Bool { 
    let defaultValue = true 
    if let value = default.valueForKey("SoundActive") { 
     // then use it 
     return value as? Bool ?? defaultValue 
    } else { 
     // oh, no value? 
     return defaultValue 
    } 
} 

Penso che questo sia il modo migliore di usarlo. Anche register(defaults:) aiuterà, ma nella documentazione Apple suggerisce di utilizzarlo come fallback, come la separazione delle situazioni di no value e default value. Dipende dal vostro bisogno

0

Inserisci questo in "didFinishLaunchingWithOptions" nel tuo AppDelegate.

if defaults.valueForKey("launchedAlready") == true { 
     print("Not first launch.") 
    } 
    else { 
     defaults.setValue(true, forKey: "launchedAlready") 
     defaults.setBool(true, forKey: "SoundActive") 
     print("Sound ON") 
    } 
5

Utilizzando "registerDefaults" è possibile impostare il valore predefinito di NSUserDefaults

let userDefaultsDefaults = [ 
      "SoundActive" : true 
     ] 

NSUserDefaults.standardUserDefaults().registerDefaults(userDefaultsDefaults) 

Nota: scrivere in didFinishLaunchingWithOptions, quindi il valore di default è impostato.

scrittura sottostante codice in cui si desidera controllare

let onoroff = NSUserDefaults.standardUserDefaults().objectForKey("SoundActive") as! Bool! 

if (onoroff != nil && onoroff == false) 
{ 
    self.checkForAgreement() 
} 
32

Swift 3 esempio di sintassi

Registra un valore predefinito booleano:

UserDefaults.standard.register(defaults: ["SoundActive" : true]) 

E per ottenere il valore:

UserDefaults.standard.bool(forKey: "SoundActive") 

Sidenote: Anche se il codice di cui sopra restituirà vero, notare che il valore non è in realtà scritto su disco fino a quando non set esso:

UserDefaults.standard.set(true, forKey: "SoundActive") 
-2

impostare e ottenere suono attivato.

var isSoundActivated: Bool { 
     get { 
      return defaults.bool(forKey: "SoundActive") 
     } 
     set { 
      defaults.set(newValue, forKey: "SoundActive") 
      defaults.synchronize() 
     } 
    } 

Imposta valore booleano da

isSoundActivated = true 

controllo del valore booleano da

if isSoundActivated { 
    print("sound activated") 
} 
2

Aggiungi questo al vostro metodo di didFinishLaunchingWithOptions dalla AppDelegate. Come altri hanno sottolineato, cerca di non abusare mettendo tutto in questo metodo.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    /// Here you can give default values to your UserDefault keys 
    UserDefaults.standard.register(defaults: [ 
     "SoundActive": true, 
     "someOtherKey": "Some Message" 
     ]) 
} 
Problemi correlati