【问题标题】:How to save the state of an UISwitch in SWIFT 4? [duplicate]如何在 SWIFT 4 中保存 UISwitch 的状态? [复制]
【发布时间】:2018-04-23 03:53:03
【问题描述】:

我想在视图控制器之间更改后保存 UISwitch 的状态。任何帮助将不胜感激!

我有第一个带有 UISwitch 的 View Controller,用于控制不同 View Controller 中的背景音乐:

@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 中应用的任何想法?

任何帮助将不胜感激!

谢谢

【问题讨论】:

  • MusicHelper 是否以模态方式显示?
  • 谢谢,我在“如何在更改 ViewControllers 时保持 UISwitch 状态?”中找到了解决方案。这正是我想要的!

标签: ios swift uislider uiswitch


【解决方案1】:

对您来说最简单的方法是创建一个static var isSwitchOn: Bool = false

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

【讨论】:

    【解决方案2】:

    如果正在播放音乐,您应该反映状态...

    class MusicHelper {
        public isPlaying: Bool {
           get {
               return musicBackgroundIntro.isPlaying
           }
        }
    
     // your stuff here..
    
    }
    

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

    SwitchMusic.isOn = MusicHelper.sharedHelper.isPlaying
    

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

    【讨论】:

      【解决方案3】:

      尝试类似的方法:将UISwitch 用作@IBOutlet

      @IBOutlet weak var checkState: UISwitch!
      
      override func viewDidLoad() {
            super.viewDidLoad()
         self.checkState.addTarget(self, action: #selector(action(sender:)), for: .valueChanged)
      }
      
      // Save state
      func action(sender: UISwitch) {
      
        let userDefaults = UserDefaults.standard
        userDefaults.set(sender.isOn, forKey:"identifier")
      
      }
      
      // Retrieve state
      override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
      
        let userDefaults = UserDefaults.standard.bool(forKey: "identifier")
        self.checkState.setOn(userDefaults, animated: false)
      
      }
      

      【讨论】:

        【解决方案4】:

        您可以在viewcontroller1 中创建开关时为其指定默认值。

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

        【讨论】:

        • 或使用 prepare(for segue: UIStoryboardSegue, sender: Any?)
        猜你喜欢
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        • 2016-07-24
        • 2016-11-27
        • 1970-01-01
        • 2014-10-28
        • 2018-05-22
        • 2011-10-03
        相关资源
        最近更新 更多