使用用户默认值保存数据

Posted

技术标签:

【中文标题】使用用户默认值保存数据【英文标题】:Saving data with User defaults 【发布时间】:2016-10-02 03:42:26 【问题描述】:

我在我的应用程序中制作了一项功能,可让您将音乐静音,我在此处放置了一个开关,以便您可以在打开和关闭之间进行切换。但是,该开关在应用程序中工作正常,当我关闭 vie 控制器并将其拉回时,它仍会显示它是如何离开的,但是当您关闭应用程序并重新打开它时,开关看起来好像它关闭了但它仍然播放音乐。这是我的代码,我会附上一张图片。

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.




这是图片 如果你不明白我上面所说的,请提出问题。

【问题讨论】:

您是在应用代理中播放音乐还是所有代码都在此视图控制器中? 【参考方案1】:

我从您的代码中了解到,您没有正确检查 用户默认值。在您的 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")

    

请检查此代码。希望对您有所帮助。

【讨论】:

我没有收到任何错误,但是当我重新启动应用程序时,音乐仍在播放,但开关切换到静音 你试过这段代码了吗?你能告诉我你在应用代理中做了什么吗? 我的应用委托中没有任何内容 我在我的 ViewController.swift 中使用你的代码 你能在viewDidLoad中调试吗,当你重新启动应用程序时,它会在什么条件下运行,比如If条件将执行,否则将执行。【参考方案2】:

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的重复呼叫。

注意:看起来您的视图控制器中确实有更多代码,因为目前没有任何东西可以播放音乐,所以这个解决方案如果您没有提供足够的信息,可能无法正常工作。

【讨论】:

我输入的正是你输入的内容,当我打开 viewController 时,它会将音乐静音 @OrenEdrich 这不是你想要的吗? 不,我让应用在后台播放音乐,我这个 ViewController 是设置菜单。所以我在那里有一个开关,允许用户将音乐静音。但是,如果我们关闭了开关,我会遇到保存问题 @OrenEdrich 这个问题非常不清楚。您没有包含音乐何时开始播放的代码,也没有解释音乐应该何时停止/开始。

以上是关于使用用户默认值保存数据的主要内容,如果未能解决你的问题,请参考以下文章

在应用加载时保存为用户默认值

使用 swift 将数组保存和检索到用户默认值

当来自模型时如何将数据保存在用户默认值中

用户默认不保存,不检索数据

如何在没有参数的情况下快速将类保存到用户默认值

如何将 JSON 令牌保存到用户默认值,然后在不同的视图中使用它?斯威夫特 4