【问题标题】:How can i update my ViewController UI using this extension delegate in another class如何在另一个类中使用此扩展委托更新我的 ViewController UI
【发布时间】:2017-10-20 20:28:44
【问题描述】:

我正在使用一个名为 AudioManager 的课程,您可以找到它作为这个问题的答案 here

它具有委托方法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)

    }

}

这是我的 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 类调用的,但是当音频文件结束并停止时,我没有调用player?.stop 按钮背景图像当然不会改变。

我如何在我的视图控制器中使用这个委托方法并知道我的音频文件何时结束并停止。

【问题讨论】:

    标签: swift class delegates avfoundation


    【解决方案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 
    }
    

    【讨论】:

    • AudioManager.shared.isAudioStopped 将如何被调用?它必须像 AVFoundation 的委托方法一样自行调用。一旦音频文件结束,它就会被调用。我在哪里称这个关闭?我每 1 秒用一个计时器调用一次,以了解音频是否已在我的视图控制器中结束? :\
    • 或者可以在变量中添加某种观察者?
    • 当调用 audioPlayerDidFinishPlaying 方法时,您的闭包也使用 isAudioStopped?(true) 调用,然后在您的 ViewController 中,例如在视图中加载,您可以放置​​ AudioManager.shared.isAudioStopped 并获取音频播放完毕时回调。在那里你可以更新你的按钮 UI
    • 是的,但我不想将闭包放在视图中加载,因为视图加载在视图控制器的生命周期中已经被调用一次。因此,当我单击播放按钮时,我永远不会知道音频是否停止,因为关闭位于已调用的 viewdidload 中。
    • 当然,但它是一个回调,所以如果视图确实加载已经被调用并不重要。您将收到更新。
    猜你喜欢
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    相关资源
    最近更新 更多