`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)
}
}
你的问题是双重的:
var player: AVAudioPlayer?
被声明为局部于 func startAudioEngine()
,因此一旦该函数存在,您就失去了对 player
. 的引用
- 您正在为可选绑定设置委托
player
改成这个(或类似的东西):
class ViewController: UIViewController, AVAudioPlayerDelegate {
var audioEngine = AVAudioEngine()
var player: AVAudioPlayer?
}
然后在您分配 player
之后,声明您的委托 self.player?.delegate = self
。确保包含 self.
以便在 class 属性 上设置委托而不是可选绑定;
遇到 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)
}
}
你的问题是双重的:
var player: AVAudioPlayer?
被声明为局部于func startAudioEngine()
,因此一旦该函数存在,您就失去了对player
. 的引用
- 您正在为可选绑定设置委托
player
改成这个(或类似的东西):
class ViewController: UIViewController, AVAudioPlayerDelegate {
var audioEngine = AVAudioEngine()
var player: AVAudioPlayer?
}
然后在您分配 player
之后,声明您的委托 self.player?.delegate = self
。确保包含 self.
以便在 class 属性 上设置委托而不是可选绑定;