【问题标题】:Userdefaults to save switch state用户默认保存开关状态
【发布时间】:2016-09-30 00:50:47
【问题描述】:

我有一个开关,当打开时会播放音乐,当开关设置为关闭时,音乐会继续播放。我的问题是,当我离开视图控制器时,当它“打开”时,开关将显示为“关闭”。我的开关代码如下,我不知道要写什么才能让应用记住开关状态,请帮忙。

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

}

【问题讨论】:

    标签: ios nsuserdefaults swift3


    【解决方案1】:

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

    @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")
    }
    }
    

    【讨论】:

      【解决方案2】:

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


      更新数据


      更新数据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()
      
              }
      
      
      
          }
      

      【讨论】:

      • 您能否展示一下我的代码的外观,我不知道如何在您的代码中输入我的代码外观。
      • 我在“CheckSwitchStatus”下遇到“bombSoundEffect”错误有什么想法吗?
      【解决方案3】:

      我的情况和你类似,我只是使用 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")
        }
        

      下面的屏幕截图可能会有所帮助:

      【讨论】:

      • 只是不保存状态吗?还是您遇到错误?任何一个都可能是一个简单的解决方案。
      • 没有保存状态
      • 将能够显示我的编码应该如何与保存开关功能
      • 我对我的答案进行了编辑,它只是在步骤 3 中交换了“是”和“否”。有时这可以解决问题。让我知道它是否有效。
      • 我要把“.state”改成什么?
      【解决方案4】:

      如果你想将 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 :(
          }
      }
      }
      

      希望对你有帮助

      编码愉快...

      【讨论】:

      • 我应该把这行代码“UserDefaults.standard.set(_ value: Bool, forKey defaultName: String)”放在哪里
      • 每次更新用户默认值时无需调用synchronize
      • 我刚刚编辑了这个问题,在我的视图控制器中显示了完整的代码,你能更新你的答案以显示我必须在“用户默认值”代码中添加的位置
      • 我输入了你写的用户“更新:”的确切代码,但它不起作用
      • 我不知道把“ UserDefaults.standard.set(mySwitch.isOn, forKey: "SwitchStatus"); UserDefaults.standard.synchronize();"和 "UserDefaults.standard.set(_ value: Bool, forKey defaultName: String)" 你能写出完整的视图控制器代码应该是什么样子吗
      猜你喜欢
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多