如何创建静默开关覆盖?

时间:2018-06-06 13:40:43

标签: swift xcode uiswitch avaudiosession

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

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”。但是,这个开关在另一个视图控制器上,我需要我的代码在初始视图控制器上,否则代码不会工作,直到用户进入首选项来更改它。我需要一些帮助来设置一个开关,可以打开/关闭此代码,并让UserDefault记住它。

1 个答案:

答案 0 :(得分:0)

所以我无法相信我弄清楚了,但我刚刚创建了另一个设置布尔值的UserDefault。如果为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为真时才会运行。'如果它是假的,则不运行任何东西。我现在需要的是警告告诉用户启用或禁用覆盖只有在他们重新启动应用程序后才能工作。