You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:35:21