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

基于UIImageView播放对应声音失效问题求助

解决你的闪卡应用声音播放问题

嘿,我一眼就看出问题出在哪了!你的声音按钮总是播放同一个声音,主要有两个核心原因,咱们一个个说,再给你靠谱的解决方案:

问题1:直接比较UIImage实例根本不靠谱

每次调用UIImage(named: "xxx")的时候,系统大概率会创建一个全新的UIImage对象(哪怕是同一张图片)。这就意味着imageView.image == UIImage(named: "card1")这种比较几乎永远是false——因为它们是两个不同的对象实例,哪怕显示的内容一模一样。

问题2:条件判断逻辑有严重漏洞

看你写的声音播放代码:

if imageView.image == UIImage(named: "card1") {
    // 播放aSound
} else if imageView.image != UIImage(named: "card2") {
    // 播放bSound
} else if imageView.image != UIImage(named: "card3") {
    // 播放cSound
}

第一个条件几乎永远不成立,直接进入第一个else if。而imageView.image != UIImage(named: "card2")又几乎永远是true(同样因为实例比较的问题),所以后面的else if根本不会执行,自然每次都只播放bSound。

另外顺便提一句,你切换图片的代码里有重复赋值的问题:

imageView.image = UIImage(named: "card2")
imageView.image = UIImage(named: "card\(number)")

第一行的赋值完全是多余的,会被第二行直接覆盖,记得删掉哦!


解决方案:用图片名称跟踪当前显示内容

咱们不要直接比较UIImage,而是新增一个变量来记录当前显示的图片名称,这样判断就准确了。

步骤1:新增跟踪变量

在你的类里添加一个变量:

var currentImageName: String?

步骤2:修改图片切换逻辑

每次设置图片的时候,同时记录对应的名称,并且删掉多余的赋值:

if let tappedImageView = gesture.view as? UIImageView {
    imageView = tappedImageView
    var targetImageName: String
    
    if segControl.selectedSegmentIndex == 0 && segControl2.selectedSegmentIndex == 0 {
        number = number % 26 + 1
        targetImageName = "card\(number)"
    } else if segControl.selectedSegmentIndex == 0 && segControl2.selectedSegmentIndex == 1 {
        number = number % 26 + 1
        targetImageName = "upper\(number)"
    } else if segControl.selectedSegmentIndex == 0 && segControl2.selectedSegmentIndex == 2 {
        number = number % 10 + 1
        targetImageName = "num\(number)"
    } else {
        // 处理其他分段控件组合的情况,这里可以设个默认图片
        targetImageName = "default_card"
    }
    
    // 只需要一次赋值就够了
    imageView.image = UIImage(named: targetImageName)
    // 记录当前图片名称
    currentImageName = targetImageName
}

步骤3:修改声音播放逻辑

基于currentImageName来判断要播放的声音,用switch会比一堆if-else更清晰:

guard let currentName = currentImageName else {
    print("No image is displayed")
    return
}

do {
    let soundPath: String
    switch currentName {
    case "card1":
        soundPath = aSound
    case "card2":
        soundPath = bSound
    case "card3":
        soundPath = cSound
    // 在这里继续添加其他图片对应的声音,比如card4、upper1等等
    default:
        print("No matching sound found for image: \(currentName)")
        return
    }
    
    audioPlayer = try AVAudioPlayer(contentsOf: URL(fileURLWithPath: soundPath))
    audioPlayer.play()
} catch {
    print("Couldn't load sound file: \(error.localizedDescription)")
}

这样修改之后,你的声音按钮就能准确识别当前显示的图片,播放对应的声音啦!

内容的提问来源于stack exchange,提问作者Derek N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:49:07