Swift 如何创建无声开关覆盖?

Swift 如何创建无声开关覆盖?,swift,xcode,uiswitch,avaudiosession,Swift,Xcode,Uiswitch,Avaudiosession,我有用户抱怨我的应用程序中没有声音。我发现这通常是因为静音开关是打开的,有了方便的回复工具,我通常可以告诉他们这一点。。。然而,这似乎是一个持续的问题,我需要解决这个问题。我找到了一种使用以下代码禁用静音开关的方法 import UIKit import AVKit import AVFoundation class InitialViewController: UIViewController { let defaults = UserDefaults.standard

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

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


我在开关上设置了一个
NSUserDefault
,以便项目记住首选项,由于它是一个简单的布尔值,我可以将代码粘贴到两个开关状态,其中一个状态为“false”。但是,此开关位于另一个视图控制器上,我需要我的代码位于初始视图控制器上,否则,在用户进入首选项进行更改之前,代码不会工作。我需要一些帮助来设置一个开关,该开关可以打开/关闭此代码,并让UserDefault记住它。

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

代码如下:

导入UIKit
导入核心图形
进口AVF基金会
类CustomTableView:UITableViewController{
//这是针对NSUserDefault的
让defaults=UserDefaults.standard
让OverrideSwitch2=“OverrideSwitch2”
//这个插座连接开关
@IBOUTLE弱var覆盖开关:UISwitch!
重写func viewDidLoad(){
super.viewDidLoad()
//这些if语句仅在一个为true或false时运行
//True:音频会话已初始化;静音开关已覆盖
如果UserDefaults.standard.bool(forKey:“Key”)==true{
做{
尝试AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
//打印(“A音频会话类别播放正常”)
做{
尝试AVAudioSession.sharedInstance().setActive(true)
打印(“音频会话”)
}捕捉错误{
//打印(错误。本地化描述)
}
}捕捉错误{
//打印(错误。本地化描述)
}
}
//False:未执行代码,静音开关正常工作
如果UserDefaults.standard.bool(forKey:“Key”)==false{
//这里没有代码
}
//此NSUserDefault会记住开关是打开还是关闭
如果let switchState=defaults.value(forKey:OverrideSwitch2){
OverrideSwitch.isOn=开关状态为!Bool
}
}
//此iAction连接到交换机;它切换应用程序下次运行时将记住的UserDefault
@iAction func switchIsChanged(覆盖开关:UISwitch){
defaults.set(OverrideSwitch.isOn,forKey:“OverrideSwitch2”)
如果覆盖switch.isOn==真{
UserDefaults.standard.set(true,forKey:“Key”)
}否则{
UserDefaults.standard.set(false,forKey:“Key”)
}
}
}