如何使用UISwitch更改变量的值?

时间:2019-02-14 00:21:55

标签: swift swift4 uiswitch

我是新手,想尽一切办法努力。我目前正在使用一个开关来切换我使用AudioKit制作的这些振荡器对象的音量开/关。我的AudioKit部分没有问题,但似乎无法弄清楚如何使用UISwitch将“ volume”变量从绝对0更改为“ on”水平。

请帮助!

我已经尝试了很多方法,但是经过大量的搜索,我到了这一点。我决定将每个音量控件的变量声明为它们的“ on”值,然后添加UISwitch并使用if语句切换音量。

class ViewController: UIViewController {

    var Fsys = 5.00

    //VOLUMES HERE:
    var volumeMono = 0.2
    var volumeBinaural = 0.6

    var A1 = 54.00
    var A2 = 108.00

    @IBAction func `switch`(_ sender: UISwitch) {
        if sender.isOn {
            volumeMono = (volumeMono) * (1)
            volumeBinaural = (volumeBinaural) * (1)
        }
        else {
            volumeMono = (volumeMono) * (0)
            volumeBinaural = (volumeBinaural) * (0)
            }
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        let generator = AKOperationGenerator(channelCount: 2) { _ in


            let leftOutput = AKOperation.sineWave(frequency: A2, amplitude: volumeBinaural)
            let rightOutput = AKOperation.sineWave(frequency: A2 + Fsys, amplitude: volumeMono)

            return [leftOutput, rightOutput]
        }

        AudioKit.output = generator
        AKSettings.playbackWhileMuted = true
        try! AudioKit.start()
        do {
            try AudioKit.start()
        } catch {
            AKLog("AudioKit did not start!")
        }

        generator.start()
    }


}

我希望这将在开关关闭(停止振荡器的声音)时将变量乘以0,而在开关打开时,开关函数会将变量乘以1,从而使音频输出与声明的变量。

运行构建时,系统默认为开始时声明的卷,并且该开关不执行任何操作。

预先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

viewDidLoad在ViewController加载时仅被调用一次。此时,您正在使用尾随闭包语法创建生成器。该关闭操作将捕获那时的volumeMono和volumeBinaural的值。它们将分别为0.2和0.6。由于闭包捕获了这些值,因此生成器的leftOutput和rightOutput将永远不会更改。

如果您的开关正常工作,则逻辑有缺陷。一旦将这些值乘以0,它们将始终为0。我对AudioKit的了解还不够,建议您在切换开关或是否可以调整某些值时创建一个新的生成器,但这就是您的开关不起作用的原因。没有任何影响。