如何在SWIFT 4中保存UISwitch的状态?

时间:2017-11-10 00:34:49

标签: ios swift uislider uiswitch

我希望在View控制器之间进行更改之后保存UISwitch的状态。任何帮助将不胜感激!

我有一个带有UISwitch的第一个View Controller,用于在不同的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()
        }
     }

如果开关处于开启或关闭状态,则第二个视图控制器可在后台加载音乐或不加音乐:

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()
            }
        }
    }

我也有一节音乐课程:

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()
    }

}

现在它在视图控制器之间的背景中完美地工作,并且可以关闭和打开...但遗憾的是不保存UISwitch的当前状态,并且总是在我进入第一个视图时控制器Switch的状态为On。

还有任何想法,如何才能在Slider中应用?

非常感谢任何帮助!

由于

4 个答案:

答案 0 :(得分:0)

最简单的方法是创建static var isSwitchOn: Bool = false

此状态将在来回转换之间保留。

答案 1 :(得分:0)

如果音乐在播放,你应该反映一下状态......

class MusicHelper {
    public isPlaying: Bool {
       get {
           return musicBackgroundIntro.isPlaying
       }
    }

 // your stuff here..

}

在其他视图控制器中这样:

SwitchMusic.isOn = MusicHelper.sharedHelper.isPlaying

如果您需要更新其他视图控制器以响应此操作,您可以根据需要添加委托事件(也称为观察者)。

答案 2 :(得分:0)

您可以在viewcontroller1创建时为交换机指定默认值。

(default.value(forKey:"switchOn") as! Bool ) ?? false分配给该开关。

答案 3 :(得分:0)

尝试类似的方法:将def dval[T >: Null](x : T): T = { null } val a1 = dval(allF) 用作UISwitch

@IBOutlet