Userdefaults 保存开关状态

Userdefaults to save switch state

我有一个开关,当转到 "on" 时会播放音乐,当开关设为 "off" 时音乐会恢复播放。我的问题是,当我离开视图控制器时,开关将显示为 "off",而它是开关 "on"。我的开关代码在下面,我不确定要写什么才能让应用记住开关状态,请帮忙。

//
//  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.
}

}

如果你想在用户默认状态下保存Switch的状态,那么可以使用 本机方法

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

像这样

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

获取开关状态时只需使用

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

更新:

@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 :(
    }
}
}

希望对您有所帮助

编码愉快...

我想你想知道在哪里插入代码。


更新


更新数据2 然后就可以直接运行了。如果有用,请UP这个答案。

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

        }



    }

我的情况跟你差不多,我就是用UserDefaults。这是有关如何操作的分步指南。

  1. 创建一个变量,如下例所示。这将设置默认设置并存储复选框的状态以备后用:

    var musicSetting = UserDefaults().string(forKey: "Music") ?? "On"
    
  2. 在您的 viewDidLoad 中,添加一个 if 语句来检查复选框是打开还是关闭,如下所示:

    if musicSetting == "On" {
        theNameOfYourSwitch.isOn = false
    } else {
        theNameOfYourSwitch.isOn = true
    }
    
  3. 在复选框的 IBAction 属性 中,添加如下 if 语句以保存您的设置,具体取决于它是什么:

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

这是一张可能有用的屏幕截图:

我找到了正确答案并决定 post 以防有人有同样的问题。

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

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

和...

override func viewDidLoad() {
super.viewDidLoad()

var defaults = NSUserDefaults.standardUserDefaults()

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