Oren Edrich
Oren Edrich

Reputation: 674

Userdefaults to save switch state

I Have a switch that when turned to "on" will put the music and when the switch is set to "off" the music will resume playing. My problem is that when i leave the view controller the switch will appear as "off" when it is switch "on". The code for my switch is below, I'm not sure what to write in order for the app to remember the switch state, please help.

//
//  SecondViewController.swift
//  Urban Sphere
//
//  Created by Oren Edrich on 9/11/16.
//  Copyright © 2016 Oren Edrich. All rights reserved.
//

import Foundation
import UIKit
import SpriteKit
import AVFoundation

var bombSoundEffect: AVAudioPlayer!
var Ghost = SKSpriteNode()

class SecondViewController: UIViewController {

var sw = false

@IBOutlet var mySwitch: UISwitch!

@IBAction func switchpressed(_ sender: AnyObject) {

    if mySwitch.isOn{

        if bombSoundEffect != nil {
            bombSoundEffect.stop()
            bombSoundEffect = nil   
        }
    }
    else{
        let path = Bundle.main.path(forResource: "newmusic.wav", ofType:nil)!
        let url = URL(fileURLWithPath: path)

        do {
            let sound = try AVAudioPlayer(contentsOf: url)
            bombSoundEffect = sound
            sound.numberOfLoops = -1
            sound.play()
        } catch {
            // couldn't load file :(
        }

    }
}

override func viewDidLoad() {

    super.viewDidLoad()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Release any cached data, images, etc that aren't in use.
}

}

Upvotes: 1

Views: 1980

Answers (4)

TDM
TDM

Reputation: 814

I have a similar situation to yours, and I just use UserDefaults. Here's a step-by-step guide on how to do it.

  1. Create a variable like the following example. This will set the default setting and store the state of the check box for use later:

    var musicSetting = UserDefaults().string(forKey: "Music") ?? "On"
    
  2. In your viewDidLoad, add an if statement that will check whether the Check Box should be On or Off, like this:

    if musicSetting == "On" {
        theNameOfYourSwitch.isOn = false
    } else {
        theNameOfYourSwitch.isOn = true
    }
    
  3. In the IBAction property for your check box, add an if statement like the following that will save your Setting, depending on what it is:

    if theNameOfYourCheckbox.state == NSOnState {
        UserDefaults().set("On", forKey: "Music")
    } else {
        UserDefaults().set("Off", forKey: "Music")
    }
    

Here's a screenshot that might help: image here...

Upvotes: 1

Oren Edrich
Oren Edrich

Reputation: 674

I found the correct answer and decided to post it incase anyone has the same question.

@IBAction func saveSwitchState(sender: AnyObject) {
    var defaults = NSUserDefaults.standardUserDefaults()

if bluetoothSwitch.on {
    defaults.setBool(true, forKey: "SwitchState")
} else {
    defaults.setBool(false, forKey: "SwitchState")
}
}

and...

override func viewDidLoad() {
super.viewDidLoad()

var defaults = NSUserDefaults.standardUserDefaults()

if (defaults.objectForKey("SwitchState") != nil) {
    bluetoothSwitch.on = defaults.boolForKey("SwitchState")
}
}

Upvotes: 3

Stark
Stark

Reputation: 1676

You want know where to insert the code , I guess.


updata


updata2 Then you can run directly. If it's useful , please UP this answer.

import Foundation
import UIKit
import SpriteKit
import AVFoundation


class SecondViewController: UIViewController {

        static let bombSoundEffect = {()->(AVAudioPlayer) in

            let path = Bundle.main.path(forResource: "newmusic.wav", ofType:nil)!
            let url = URL(fileURLWithPath: path)
            return try! AVAudioPlayer(contentsOf: url)
        }()

        var sw = false

        var Ghost = SKSpriteNode()


        @IBOutlet var mySwitch: UISwitch!

        @IBAction func switchpressed() {

            if mySwitch.isOn{

                SecondViewController.bombSoundEffect.play()
            }else{

                SecondViewController.bombSoundEffect.stop()
            }

            //*************    save status    *************
            UserDefaults.standard.set(mySwitch.isOn, forKey: "SwitchStatus");


        }

        override func viewDidLoad() {

            super.viewDidLoad()



            mySwitch.addTarget(self, action: #selector(switchpressed), for: .valueChanged)

            //*************    load status    *************
            mySwitch.isOn = UserDefaults.standard.bool(forKey: "SwitchStatus");
            switchpressed()

        }



    }

Upvotes: 1

Janmenjaya
Janmenjaya

Reputation: 4163

If you want to save the state of Switch in user default, then can use the native method

UserDefaults.standard.set(_ value: Bool, forKey defaultName: String)

Like this

    UserDefaults.standard.set(mySwitch.isOn, forKey: "SwitchStatus");
    UserDefaults.standard.synchronize();

While fetching switch status just use

    let status = UserDefaults.standard.bool(forKey: "SwitchStatus");

UPDATE :

@IBAction func switchpressed(_ sender: AnyObject) {

UserDefaults.standard.set(mySwitch.isOn, forKey: "SwitchStatus");

if mySwitch.isOn{

    if bombSoundEffect != nil {
        bombSoundEffect.stop()
        bombSoundEffect = nil
    }
}
else{
    let path = Bundle.main.path(forResource: "newmusic.wav", ofType:nil)!
    let url = URL(fileURLWithPath: path)
    do {
        let sound = try AVAudioPlayer(contentsOf: url)
        bombSoundEffect = sound
        sound.numberOfLoops = -1
        sound.play()
    } catch {
        // couldn't load file :(
    }
}
}

Hope it helps

Happy coding ...

Upvotes: 0

Related Questions