代码之家  ›  专栏  ›  技术社区  ›  Adem

如何创建静默开关覆盖?

  •  0
  • Adem  · 技术社区  · 6 年前

    我有用户抱怨我的应用程序没有声音。我发现这通常是因为静音开关打开了,而有了方便的回复工具,我通常可以告诉他们这一点…不过,这似乎是一个持续的问题,我需要解决这个问题。我找到了一种用下面的代码禁用静音开关的方法。

    import UIKit
    import AVKit
    import AVFoundation
    
    
    class InitialViewController: UIViewController {
    
        let defaults = UserDefaults.standard
    
        override func viewDidLoad() {
            super.viewDidLoad()
            do {
                try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
                //print("AVAudioSession Category Playback OK")
                do {
                    try AVAudioSession.sharedInstance().setActive(true)
                    //print("AVAudioSession is Active")
                } catch _ as NSError {
                    //print(error.localizedDescription)
                }
            } catch _ as NSError {
                //print(error.localizedDescription)
            }
        }
    }
    

    幸运的是,这段代码可以工作,但我希望用户仍然可以控制是否启用了这段代码。默认情况下,我希望启用它并允许用户打开或关闭此功能。对于我的另一个视图控制器,我有:

    import UIKit
    import AVFoundation
    
    class CustomTableView: UITableViewController {
    
        let defaults = UserDefaults.standard
        let OverrideSwitch2 = "OverrideSwitch2"
    
        @IBOutlet weak var OverrideSwitch: UISwitch!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            if let fixFin = defaults.value(forKey: OverrideSwitch2) {
                OverrideSwitch.isOn = fixFin as! Bool
            }
    
        }
        @IBAction func `switch`(_ sender: UISwitch) {
            defaults.set(sender.isOn, forKey: "OverrideSwitch2")
            if (sender.isOn == true){
                //Code to switch feature on
            } else {
                //Code to switch feature off
            }
        }
    }
    

    enter image description here

    我已经建立了一个 NSUserDefault 在开关上,这样项目就记住了首选项,因为这是一个简单的布尔值,所以我可以在两个开关状态下粘贴代码,其中一个状态为“false”。但是,这个开关在另一个视图控制器上,我需要我的代码在初始视图控制器上,否则代码不起作用。直到用户进入首选项进行更改。我需要一些帮助来设置一个开关,可以打开/关闭这段代码,并让用户默认记住它。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Adem    6 年前

    所以我不敢相信我找到了答案,但我刚刚创建了另一个用户默认值来设置布尔值。如果为true,则运行avaudiosession的代码。如果为false,则不会执行任何操作。这个userdefault通过开关切换,开关还有一个userdefault来记住开关状态。

    代码如下:

    import UIKit
    import CoreGraphics
    import AVFoundation
    
    
    
    class CustomTableView: UITableViewController  {
    
        //This is for the NSUserDefaults
        let defaults = UserDefaults.standard
        let OverrideSwitch2 = "OverrideSwitch2"
        
        //This Outlet connects the Switch
        @IBOutlet weak var OverrideSwitch: UISwitch!
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
    //These if statements only run if one is true or false
            
            //True: AVAudioSession is initialized; Silent Switch is Overridden
            if UserDefaults.standard.bool(forKey: "Key") == true {
            do {
                try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
                //print("AVAudioSession Category Playback OK")
                do {
                    try AVAudioSession.sharedInstance().setActive(true)
                    print("AVAudioSession")
                } catch _ as NSError {
                    //print(error.localizedDescription)
                }
            } catch _ as NSError {
                //print(error.localizedDescription)
        }
            
    }
        
            //False: No Code is executed, silent switch works as normal
            if UserDefaults.standard.bool(forKey: "Key") == false {
              
                //No Code Here
    }
            
            //This NSUserDefault remembers if the switch is on or off
            if let switchState = defaults.value(forKey: OverrideSwitch2) {
                OverrideSwitch.isOn = switchState as! Bool
            }
        }
        
        //This IBAction is connected to the switch; It toggles the UserDefault which your app will remember next time you run it
       @IBAction func switchIsChanged(_ OverrideSwitch: UISwitch) {
        defaults.set(OverrideSwitch.isOn, forKey: "OverrideSwitch2")
            if OverrideSwitch.isOn == true {
              
                UserDefaults.standard.set(true, forKey: "Key")
                
            } else {
                
                UserDefaults.standard.set(false, forKey: "Key")
        
            }
        }
    }

    简单地说,如果切换开关“on”,nsuserdefault将运行一个函数来初始化会话,该函数仅在bool为“true”时运行。如果为false,则不运行任何内容。我现在只需要提醒用户,启用或禁用覆盖将只在他们重新启动应用程序后才起作用。