如何在另一个类

时间:2017-10-20 20:28:44

标签: swift class delegates avfoundation

我正在使用一个名为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中使用此委托方法,并知道我的音频文件何时结束并停止。

1 个答案:

答案 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 
}