【问题标题】:`audioPlayerDidFinishPlaying` Not Being Called [duplicate]`audioPlayerDidFinishPlaying`没有被调用[重复]
【发布时间】:2019-10-27 18:44:57
【问题描述】:

遇到audioPlayerDidFinishPlaying 未被调用的问题...

我查看了其他一些 SO 线程:

Swift: AudioPlayerDidFinished will not be called

AVAudioPlayerDelegate doesn't call the method

...但仍然有同样的问题。

我已将ViewController 设置为符合AVAudioPlayerDelegate

class ViewController: UIViewController, AVAudioPlayerDelegate {
var audioEngine = AVAudioEngine()
...
}

并在这里创建播放器;在创建播放器后立即设置委托:

func startAudioEngine(audioFileURL: URL) {

    var player: AVAudioPlayer?

    do {
        try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
        try AVAudioSession.sharedInstance().setActive(true)

        player = try AVAudioPlayer(contentsOf: audioFileURL, fileTypeHint: AVFileType.mp3.rawValue)

        guard let player = player else { return }
        player.delegate = self

        player.prepareToPlay()
        player.play()

    } catch let error {
        print(error.localizedDescription)
    }
}

【问题讨论】:

    标签: ios swift avaudioplayer avaudiosession avaudioengine


    【解决方案1】:

    你的问题是双重的:

    1. var player: AVAudioPlayer? 被声明为 func startAudioEngine() 的本地函数,因此一旦函数存在,您就会失去对 player 的引用。
    2. 您正在将代理设置为可选绑定的player

    改成这个(或类似的):

    class ViewController: UIViewController, AVAudioPlayerDelegate {
      var audioEngine = AVAudioEngine()
      var player: AVAudioPlayer?
    }
    

    然后在分配player 之后,声明您的委托self.player?.delegate = self。确保包含self.,以便在类属性而不是可选绑定上设置委托;

    【讨论】:

      猜你喜欢
      • 2017-08-15
      • 1970-01-01
      • 2014-09-17
      • 2017-11-12
      • 2013-09-11
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 2017-08-12
      相关资源
      最近更新 更多