我正在使用一个叫做AudioManager
你可以在这里找到它作为这个问题的答案的类。
它具有委托方法AVAudioPlayerDelegate
作为AudioManager
类的扩展。
有没有办法在我的视图控制器中使用这个或覆盖这些委托方法,以便能够更改我的 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)
}
}
这是我的视图控制器播放按钮代码:
@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
类中调用该方法,但是当音频文件结束并停止时,我没有调用player?.stop
按钮背景图像当然不会改变。
我如何在我的视图控制器中使用这个委托方法并知道我的音频文件何时结束并停止。
在您的 AudioManager 类中,您可以实现一个回调(闭包),如:
var isAudioStopped: ((Bool) -> Void)?
你可以在你的扩展中的委托方法中调用它:
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer,
成功标志:布尔){
player.stop()
isAudioStopped?(true)
print("Finish Playing")
}
然后在您的 ViewController 方法中:
AudioManager.shared.isAudioStopped = {
[weak self] completion in
// if completion the audio is stopped
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句