我正在使用一个名为AudioManager
的课程,你可以找到它来回答这个问题here。
它有委托方法AVAudioPlayerDelegate
作为AudioManager
类的扩展名。
有没有办法在我的viewcontroller中使用它或覆盖这些委托方法,以便能够在我的UI中更改属性。 这是扩展名:
extension AudioManager: AVAudioPlayerDelegate {
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer,
successfully flag: Bool) {
player.stop()
print("Finish Playing")
}
func audioPlayerDecodeErrorDidOccur(_ player: AVAudioPlayer,
error: Error?) {
print(/error?.localizedDescription)
}
}
这是我的viewcontroller播放按钮代码:
@IBAction func playButtonTapped(_ sender: UIButton) {
if AudioManager.shared.player == nil {
if recordFilePath != nil {
AudioManager.shared.setupPlayer(URL(string:recordFilePath)!)
}
}
if playButtonIsChecked {
playButtonIsChecked = false
AudioManager.shared.player?.play()
playRecordButton.setBackgroundImage(#imageLiteral(resourceName: "pauseProfileButton"), for: .normal)
} else {
playRecordButton.setBackgroundImage(#imageLiteral(resourceName: "editProfilePlay"), for: .normal)
playButtonIsChecked = true
AudioManager.shared.player?.stop()
}
上面的代码很好,当我调用player?.stop()
时,正在从AVAudioPlayerDelegate
类调用AudioManager
方法,但是当音频文件结束并在没有调用时停止{ {1}}按钮背景图片不会改变。
如何在我的viewcontroller中使用此委托方法,并知道我的音频文件何时结束并停止。
答案 0 :(得分:1)
在AudioManager类中,您可以实现一个回调(闭包),如:
var isAudioStopped: ((Bool) -> Void)?
您可以使用委托方法在您的扩展程序中调用它:
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer,
成功标记:Bool){
player.stop()
isAudioStopped?(true)
print("Finish Playing")
}
然后在你的ViewController方法中:
AudioManager.shared.isAudioStopped = {
[weak self] completion in
// if completion the audio is stopped
}