2017-02-27 1 views
-2

J'essaie d'enregistrer une valeur bool dans UserDefaults à partir d'un commutateur UIS et de la récupérer dans un autre affichage. Cependant, j'ai essayé de suivre plusieurs tutoriels et d'empiler des réponses et aucun ne semble fonctionner.Enregistrement et récupération d'un booléen avec UserDefaults

Voici comment j'enregistrer:

class SettingsViewController: UITableViewController { 

@IBOutlet weak var soundSwitchOutlet: UISwitch! 

@IBAction func soundSwitch(_ sender: UISwitch) { 

    UserDefaults.standard.set(soundSwitchOutlet.isOn, forKey: "sound") 

} 

et voilà comment je suis en train de le récupérer dans une autre vue:

if let savedValue = UserDefaults.standard.bool(forKey: "sound") { 
     boolValue = savedValue 
    } 

//this is inside viewDidLoad and "boolValue" was declared outside viewDidLoad// 

Pour une raison ce code me donne erreurs et aucune des choses que j'ai essayé ont travaillé. Comment puis-je enregistrer un booléen dans UserDefaults et le récupérer dans une autre vue?

Edit: Je pense avoir corrigé la première partie. Cependant, la façon dont je récupère le booléen semble être totalement fausse. Aussi: Aucune autre réponse stackExchange ne répond à ce que je demande, du moins pas dans swift.

+0

double possible de http://stackoverflow.com/questions/34373668/how-can-i-save-a-boolean-in-nsdefaults-when-a -bouton-est-pressé? –

+0

'UserDefaults.standard.set (sender.isOn, forKey:" son ")' –

+0

lecture bool pour la clé retourne un Bool (pas optionnel) 'boolValue = UserDefaults.standard.bool (forKey:" son ")' –

Répondre

5

Comme Leo mentionné dans les commentaires bool(forKey renvoie une Bool non facultative. Si la clé n'existe pas, false est renvoyé.

Il est tout simplement

boolValue = UserDefaults.standard.bool(forKey: "sound") 

Appel synchronize() comme suggéré dans d'autres réponses ne sont pas nécessaires. Le framework met régulièrement à jour la base de données par défaut des utilisateurs.

+0

Merci! L'état du commutateur reste enregistré, mais lorsque j'essaie d'utiliser la valeur bool dans une autre vue, il reste bloqué sur la valeur booléenne avec laquelle il a commencé. – Gabe12

+1

N'utilisez pas 'UserDefaults' comme stockage temporaire ou pour transmettre des données entre contrôleurs. – vadian

0

Utilisez cette ligne de code:

@IBAction func soundSwitch(_ sender: UISwitch) { 
    UserDefaults.standard.set(soundSwitchOutlet.isOn, forKey: "sound") 
} 

insteadof:

@IBAction func soundSwitch(_ sender: UISwitch) { 
    UserDefaults.standard.set(soundSwitchOutlet, forKey: "sound") 
} 
0

Faites comme ceci.

Dans votre first view controller.

  • créer une connexion IBoutlet à votre UISwitch

  • Et puis l'action pour votre UISwitch. donc à la fin, votre first view controller devrait ressembler à ceci.

importation UIKit

class FirstViewController: UIViewController { 


    @IBOutlet weak var myswitch: UISwitch! // Outlet connection to your UISwitch (just control+ drag it to your controller) 




    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 

    } 

    @IBAction func myswitchAction(_ sender: Any) { // Action for your UISwitch 

     var myswitctBool : Bool = false // create a local variable that holds your bool value. assume that in the beginning your switch is offed and the boolean value is `false` 

     if myswitch.isOn == true { // when user turn it on then set the value to `true` 
      myswitctBool = true 
     } 
     else { // else set the value to false 
      myswitctBool = false 
     } 


     // finally set the value to user default like this 
     UserDefaults.standard.set(myswitctBool, forKey: "mySwitch") 
     //UserDefaults.standard.synchronize() - this is not necessary with iOS 8 and later. 


    } 

} 

Fin du premier contrôleur de vue

maintenant dans votre deuxième vue contrôleur

  • vous pouvez ge t la valeur userdefault que vous définissez dans first view controller. Je l'ai mis dans la méthode viewdidload pour vous montrer comment cela fonctionne.

importation UIKit

class SecondViewController: UIViewController { 

     override func viewDidLoad() { 
      super.viewDidLoad() 


      let myswitchBoolValuefromFirstVc : Bool = UserDefaults.standard.bool(forKey: "mySwitch")// this is how you retrieve the bool value 


      // to see the value, just print those with conditions. you can use those for your things. 
      if myswitchBoolValuefromFirstVc == true { 
       print("true") 
      } 
      else { 
       print("false") 
      } 


     } 

     override func didReceiveMemoryWarning() { 
      super.didReceiveMemoryWarning() 

     } 




    } 

Espérons que cela vous aidera à vous. bonne chance

+1

yep @EricAya nous n'en avons plus besoin d'iOS 8. accepté et je vais l'enlever. thanx –

-1

Essayez ceci:

@IBAction func soundSwitchs(_ sender: Any) 
{ 
    UserDefaults.standard.set(soundSwitchOutlet.isOn, forKey: "sound") 
    UserDefaults.standard.synchronize() 
} 

    //this is inside viewDidLoad and "boolValue" was declared outside viewDidLoad// 

boolValue = UserDefaults.standard.bool(forKey: "sound") 
+0

'.synchronize()' est inutile. Exécutez des tests, vous verrez par vous-même. – Moritz