如何从一个视图控制器向另一个视图控制器发送和接收 UISlider 值

How to send and receive UISlider value from one view controller to another

我正在尝试使用 NotificationCenter 将滑块值(音频音量)发送到另一个包含我需要的所有音频引擎的视图控制器。 来自发件人 VC 我试过这个:

@IBAction func vol1ChangedFromMixer(sender: UISlider) {
    NotificationCenter.default.post(name: Notification.Name(rawValue: "vol1FromMixer"), object: nil)
    }

然后在接收方 VC,在 viewDidLoad:

//vol from mixer
    NotificationCenter.default.addObserver(self, selector: #selector(vol1FromMixer(_:)), name: Notification.Name(rawValue: "vol1FromMixer"), object: nil)

稍后在同一个接收方 VC:

//vol from mixer function
      @objc func vol1FromMixer() {
        _engine.setAmpGain(Double(sender.value)*2.0, ofTrack: sender.tag)
}

在接收方 VC 处错误使用了未解析的标识符 "sender"。当然,我还没有准备好可以发送的 UISlider 类型的值。有什么建议吗?

您需要从 vol1ChangedFromMixer 方法传递 sender。您可以使用此 method,并在 userInfo 中传递 sender。然后在vol1FromMixer

中检索

有点像

@IBAction func vol1ChangedFromMixer(sender: UISlider) {
    NotificationCenter.default.post(name: Notification.Name(rawValue: "vol1FromMixer"), object: nil, userInfo: ["slider": sender])
}

@objc func vol1FromMixer(_ notification: Notification) {
    guard let sender = notification.userInfo["slider"] as? UISlider
         else { return }
    _engine.setAmpGain(Double(sender.value)*2.0, ofTrack: sender.tag)
}

没有通知的解决方案

1。创建 class 'DataManager'

这个 class 在我的 `Tools.swift` 文件中
class DataManager {
    ///to call function in VCA from VCB
    ///needs three elements:
    /// 1. this class
    /// 2. 'DataManager.shared.fistVCYouNameIt1 = self’ in VCA in viewDidLoad()
    /// 3. 'DataManager.shared.fistVCYouNameIt1.myFuncInVcAToCallFromVcB()' in VCB (execute function in VCA)
    static let shared = DataManager()
    var fistVCYouNameIt1 = ViewController1() //class Name
    var fistVCYouNameIt2 = ViewController1() //class Name
    //var fistVCYouNameIt3 ...
}//end class DataManager

2。在你的 VCA 中,在 viewDidLoad():

override func viewDidLoad() {
    super.viewDidLoad()
    DataManager.shared.fistVCYouNameIt1 = self //to call func ‘myFuncInVcAToCallFromVcB ()’ from VCB in VCA. Without this e.g. your outlets are not accessible within VCA, when called from VCB

    //other code
}

3。在你的 VCB

您的代码 VCB 中要在 VCA 中调用函数的要点:
...
DataManager.shared.fistVCYouNameIt.myFuncInVcAToCallFromVcB() //execute func in VCA 
...

4。在您的 VCA 中:

func myFuncInVcAToCallFromVcB (){
    //your code here
}