使用用户默认值保存数据
Saving data with User defaults
我正在我的应用程序中制作一个功能,允许您将音乐静音,我在那里放了一个开关,这样您就可以在打开和关闭之间切换。但是,该开关在应用程序中工作正常,当我关闭 vie 控制器并将其拉回时,它仍会显示它是如何离开的,但是当您关闭应用程序并重新打开它时,开关看起来好像关闭了但它仍然播放 music.This 是我的代码,我会附上一张照片。
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) {
let defaults = UserDefaults.standard
if mySwitch.isOn{
defaults.set(true, forKey: "SwitchState")
if bombSoundEffect != nil {
bombSoundEffect.stop()
bombSoundEffect = nil
}
}
else{
defaults.set(false, forKey: "SwitchState")
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()
super.viewDidLoad()
let defaults = UserDefaults.standard
if (defaults.object(forKey: "SwitchState") != nil) {
mySwitch.isOn = defaults.bool(forKey: "SwitchState")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
}
}
这是图片
如果你不明白我上面说的,请提问。
据我从您的代码中了解到,您没有正确检查 User Defaults。在您的 viewDidLoad 中,您必须检查 user defaults 的 bool 值是否设置为 true。
override func viewDidLoad() {
super.viewDidLoad()
let defaults = UserDefaults.standard
//check bool Value is set to true or not
if defaults.bool(forKey: "SwitchState") == true {
mySwitch.isOn = defaults.bool(forKey: "SwitchState")
} else {
print("false")
}
}
请检查此代码。希望对你有帮助。
在viewDidLoad
中您需要检查何时需要暂停音乐:
// Keep this part the same
let defaults = UserDefaults.standard
if (defaults.object(forKey: "SwitchState") != nil) {
mySwitch.isOn = defaults.bool(forKey: "SwitchState")
}
// Check to see if the switch is off, if so, stop the music
if !mySwitch.isOn {
bombSoundEffect.stop()
bombSoundEffect = nil
}
你也可以去掉对super.viewDidLoad
的重复调用。
注意:看起来你的视图控制器中确实有更多代码,因为目前没有任何东西可以正在播放音乐,因此鉴于您没有提供足够的信息,此解决方案可能无效。
我正在我的应用程序中制作一个功能,允许您将音乐静音,我在那里放了一个开关,这样您就可以在打开和关闭之间切换。但是,该开关在应用程序中工作正常,当我关闭 vie 控制器并将其拉回时,它仍会显示它是如何离开的,但是当您关闭应用程序并重新打开它时,开关看起来好像关闭了但它仍然播放 music.This 是我的代码,我会附上一张照片。
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) {
let defaults = UserDefaults.standard
if mySwitch.isOn{
defaults.set(true, forKey: "SwitchState")
if bombSoundEffect != nil {
bombSoundEffect.stop()
bombSoundEffect = nil
}
}
else{
defaults.set(false, forKey: "SwitchState")
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()
super.viewDidLoad()
let defaults = UserDefaults.standard
if (defaults.object(forKey: "SwitchState") != nil) {
mySwitch.isOn = defaults.bool(forKey: "SwitchState")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
}
}
这是图片
据我从您的代码中了解到,您没有正确检查 User Defaults。在您的 viewDidLoad 中,您必须检查 user defaults 的 bool 值是否设置为 true。
override func viewDidLoad() {
super.viewDidLoad()
let defaults = UserDefaults.standard
//check bool Value is set to true or not
if defaults.bool(forKey: "SwitchState") == true {
mySwitch.isOn = defaults.bool(forKey: "SwitchState")
} else {
print("false")
}
}
请检查此代码。希望对你有帮助。
在viewDidLoad
中您需要检查何时需要暂停音乐:
// Keep this part the same
let defaults = UserDefaults.standard
if (defaults.object(forKey: "SwitchState") != nil) {
mySwitch.isOn = defaults.bool(forKey: "SwitchState")
}
// Check to see if the switch is off, if so, stop the music
if !mySwitch.isOn {
bombSoundEffect.stop()
bombSoundEffect = nil
}
你也可以去掉对super.viewDidLoad
的重复调用。
注意:看起来你的视图控制器中确实有更多代码,因为目前没有任何东西可以正在播放音乐,因此鉴于您没有提供足够的信息,此解决方案可能无效。