ios - 如何多次使用audioPlayerDidFinishPlaying

标签 ios swift avplayer

我在 MainStoryBoard 上创建了带有图像的 UIButton。当我按下该按钮时,它会播放音频文件,并且在播放音频时,UIButton 的背景颜色会发生变化。

audioPlayerDidFinishPlaying1 被正确调用,但是audioPlayerDidFinishPlaying2 似乎没有被调用。我很感激任何引导我解决这个问题的建议。

    let url1 = Bundle.main.bundleURL.appendingPathComponent("music1.mp3")
    let url2 = Bundle.main.bundleURL.appendingPathComponent("music2.mp3")

    @IBOutlet weak var yourButton: CustomButton!
    @IBOutlet weak var yourButton2: CustomButton! 

   func Player(url: URL) {
        do {
            try player = AVAudioPlayer(contentsOf:url)
            player.play()
            yourButton.isSelected = true
            player.delegate = self
        } catch {
            print(error)
        }
    }

    func Player1(url: URL) {
        do {
            try player = AVAudioPlayer(contentsOf:url)
            player.play()
            yourButton2.isSelected = true
            player.delegate = self
        } catch {
            print(error)
        }
    }
    @IBAction func pushButton1(sender: UIButton) {
        Player(url: url1)
    }
    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        yourButton.isSelected = false

    }

    @IBAction func pushButton2(sender: UIButton) {
        Player1(url: url2)
    }
    func audioPlayerDidFinishPlaying2(_ player: AVAudioPlayer, successfully flag: Bool) {
        yourButton2.isSelected = false
    }

最佳答案

您正在 Player1/Player 方法中本地创建播放器。因此,当该方法结束时,玩家将被释放。将生成的玩家保留为类成员,这样当方法退出时它就不会被释放

在您的类(class)中添加:

class YourClass
{
    let url1 = Bundle.main.bundleURL.appendingPathComponent("music1.mp3")
    let url2 = Bundle.main.bundleURL.appendingPathComponent("music2.mp3")

    @IBOutlet weak var yourButton: CustomButton!
    @IBOutlet weak var yourButton2: CustomButton! 

    fileprivate var player1: AVAudioPlayer? 
    fileprivate var player2: AVAudioPlayer?

    .
    .
    .

    func Player(url: URL) {
        do {
            try player1 = AVAudioPlayer(contentsOf:url)
            player1!.play()
            yourButton.isSelected = true
            player1!.delegate = self
        } catch {
            print(error)
        }
    }

另一件事..您正在使用委托(delegate)方法audioPlayerDidFinishPlaying,它是AVAudioPlayer的委托(delegate)方法。但是 audioPlayerDidFinishPlaying2 不是,所以它在这里没有用。由于您有两名玩家,并且有一个职业作为代表,因此您需要确定哪个玩家已完成并更改正确的按钮。

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
    if (player === player1) {
        yourButton.isSelected = false
    } else if (player === player2) {
        yourButton2.isSelected = false
    }
}

关于ios - 如何多次使用audioPlayerDidFinishPlaying,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42185549/

相关文章:

ios - 如何在 Xcode 中验证 Localizable.strings 文件?

ios - 解包 GMSPlacesClient 类型的可选值时意外发现 nil

ios - 选项卡栏上的选定索引不适用于 Swift

ios - AVPlayerLooper 每次迭代后黑色闪烁

ios - 如何从 AVPlayer 中提取隐藏式字幕/字幕

ios - AVPlayer seekToTime 方法在 iOS 9 上停止工作

ios - GCD block 中的runLoop如何在没有源码的情况下工作

ios - subview 滚动不起作用 SWIFT

ios - 将音频 .wav 文件从 http 服务器流式传输到 ios 客户端

Swift 2 iOS 9 Do Catch 尝试崩溃并发现意外的 nil