首页 > 解决方案 > 如何从委托回调刷新 Swift UIViewController

问题描述

我是菜鸟。我有一些编程经验,但不熟悉 Swift 4 和 Xcode 9.2。

我一直在学习教程和阅读。我已经实现了许多音乐播放器示例之一。我已将其扩展为显示歌曲元数据。这工作正常。

我已经实现了 AVAudioPlayerDelegate audioPlayerDidFinishPlaying() 函数。在这个函数中,我抓取下一首歌曲的元数据,设置视图变量,然后播放歌曲。歌曲播放,但旧歌曲元数据仍然存在。

如何使用新的元数据刷新视图?

对于这样一个简单的问题,我提前道歉。我已经广泛搜索答案,要么不理解,要么似乎不适用。善良,我又老又脆弱。

import UIKit
import AVFoundation

class SecondViewController: UIViewController, AVAudioPlayerDelegate {
    @IBOutlet weak var currentSongArtwork: UIImageView!
    @IBOutlet weak var currentSongTitle: UILabel!
    var audioPlayer = AVAudioPlayer()

    override func viewDidLoad() {
        super.viewDidLoad()
        playSong()
    }

    func playSong() {
        extractSongMetaData()
        currentSongTitle.text = extractedSongTitle
        currentSongArtwork = extractedSongArtwork

        let audioPath = Bundle.main.path(forResource: songs[currentSongIndex], ofType: ".m4a")
        try audioPlayer = AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: audioPath!) as URL)
        audioPlayer.delegate = self
        audioPlayer.play()
    }

    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
        // Increment currentSongIndex

        playSong()
      }
}

标签: swiftuiviewcontroller

解决方案


您可能需要在 UI 线程中调用 playSong 才能正确刷新。

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
    // Increment currentSongIndex

    DispatchQueue.main.async
    {
        playSong()
    }
}

推荐阅读