swift - 如何从委托回调刷新 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()
}
}
解决方案
您可能需要在 UI 线程中调用 playSong 才能正确刷新。
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
// Increment currentSongIndex
DispatchQueue.main.async
{
playSong()
}
}
推荐阅读
- sql - SQl 查询以获取类似于图像的输出
- random - 如何纠正 TypeError 与选择()缺少 1 个必需的位置参数:“人口”
- java - 如何将“对象”转换为未知的自定义数据类型/类对象?
- java - 如何在 Android 中的多个活动和片段中保留对象?
- node.js - mongodb 连接大约需要 10 秒
- python - 据称正确的 SPARQL 查询(Wikidata)在 Python 中没有产生任何结果
- python - 有没有办法使用熊猫将多个标志列汇总为一个?
- python-3.x - 如何从python数组创建对象
- python - 使用 numpy 数组 Pandas 修改数据框中多列的快速方法
- r - 如何在 RStudio 中创建未堆叠的点图?