How to save the state of an UISwitch in SWIFT 4?

Manu picture Manu · Nov 10, 2017 · Viewed 7.3k times · Source

I would like to save the State of an UISwitch after to change between View Controllers. Any help would be greatly appreciated!

I have a first View Controller with an UISwitch, to control the music in the background in different View Controllers:

@IBOutlet weak var SwitchMusic: UISwitch!
        let defaults = UserDefaults.standard
        var switchON : Bool = false

@IBAction func checkState(_ sender: UISwitch) {
        if (sender.isOn == true)
        {
            switchON = true
            defaults.set(switchON, forKey: "switchON")
            MusicHelper.sharedHelper.playBackgroundMusic()
        }
        if (sender.isOn == false)
        {
            switchON = false
            defaults.set(switchON, forKey: "switchON")
            MusicHelper.sharedHelper.stopBackgroundMusic()
        }
     }

And a Second View Controller to load or no the music in the background if the switch is On or Off:

override func viewDidLoad() {
        super.viewDidLoad()

        if defaults.value(forKey: "switchON") != nil{
            let switchON: Bool = defaults.value(forKey: "switchON")  as! Bool
            if switchON == true{
                MusicHelper.sharedHelper.playBackgroundMusic()
            }
            else if switchON == false{
                MusicHelper.sharedHelper.stopBackgroundMusic()
            }
        }
    }

Also I have a class with the music:

class MusicHelper {

    let defaults = UserDefaults.standard

    static let sharedHelper = MusicHelper()

    var musicBackgroundIntro:AVAudioPlayer = AVAudioPlayer()
    func playBackgroundMusic() {
        do {
            let audioPath = Bundle.main.path(forResource: "Music", ofType: "mp3")
            try musicBackgroundIntro = AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: audioPath!) as URL)
            musicBackgroundIntro.numberOfLoops = -1
            musicBackgroundIntro.prepareToPlay()
            musicBackgroundIntro.play()
        } catch {
            print("Cannot play the file")
        }
    }
    func stopBackgroundMusic() {
        musicBackgroundIntro.stop()
    }

}

Now it is working perfectly the music in the background between View Controllers, and it is possible to turn off and on... but unfortunately do not save the current state of the UISwitch, and always when I enter in the First View Controller the state of the Switch is On.

Also any idea that how will be possible to apply in a Slider too?

Any help would be greatly appreciated!

Thanks

Answer

Shamas S picture Shamas S · Nov 10, 2017

The easiest way for you would be to create a static var isSwitchOn: Bool = false

This state will be preserved between back and forth transitions.