如何从一个视图控制器向另一个视图控制器发送和接收 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
}
我正在尝试使用 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
}