如何通过NotificationCenter在视图控制器间传递UISlider音量值?
解决NotificationCenter传递UISlider数据的问题
你遇到的错误核心是:发送通知时没有携带UISlider的关键数据,接收端无法直接获取到sender对象。下面是具体的修复方案:
步骤1:修改发送端,携带UISlider数据
在发送通知时,利用userInfo参数把需要的value和tag打包传递:
@IBAction func vol1ChangedFromMixer(sender: UISlider) { // 把滑块的数值和标签打包到字典中 let sliderData = [ "volume": sender.value, "trackTag": sender.tag ] NotificationCenter.default.post( name: Notification.Name(rawValue: "vol1FromMixer"), object: nil, userInfo: sliderData ) }
步骤2:修改接收端处理函数,提取传递的数据
接收端的处理函数需要接收Notification参数,然后从userInfo中取出数据(注意做可选绑定,避免因数据类型不匹配导致崩溃):
@objc func vol1FromMixer(_ notification: Notification) { // 安全取出传递的参数 guard let volumeValue = notification.userInfo?["volume"] as? Float, let trackTag = notification.userInfo?["trackTag"] as? Int else { print("无法获取滑块数据") return } // 调用音频引擎方法 _engine.setAmpGain(Double(volumeValue)*2.0, ofTrack: trackTag) }
额外优化建议(可选)
为了避免拼写错误,建议用静态常量定义通知名称,比如在全局或者某个类中扩展Notification.Name:
extension Notification.Name { static let volumeFromMixer = Notification.Name("vol1FromMixer") }
这样发送和接收时可以直接用.volumeFromMixer,代码更健壮:
// 发送端 NotificationCenter.default.post( name: .volumeFromMixer, object: nil, userInfo: sliderData ) // 接收端添加观察者 NotificationCenter.default.addObserver( self, selector: #selector(vol1FromMixer(_:)), name: .volumeFromMixer, object: nil )
内容的提问来源于stack exchange,提问作者Sktsalad
相关产品推荐
相关产品推荐

