`audioPlayerDidFinishPlaying` 未被调用

`audioPlayerDidFinishPlaying` Not Being Called

遇到 audioPlayerDidFinishPlaying 没有被调用的问题...

我看过其他一些 SO 线程:

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

我已将 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)
    }
}

你的问题是双重的:

  1. var player: AVAudioPlayer? 被声明为局部于 func startAudioEngine(),因此一旦该函数存在,您就失去了对 player.
  2. 的引用
  3. 您正在为可选绑定设置委托 player

改成这个(或类似的东西):

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

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