我正在开发一个音频播放器应用程序,该应用程序应允许用户在UITableView中单击UITableViewCell上的按钮以播放歌曲,然后他们可以在进度条上看到歌曲的进度。我不想为每个单元格创建一个对象,我认为这会使我失去很多效率,所以我改用dequeueReusableCell()函数根据excel中的数据初始化单元格。
由于某种原因,当我调用函数updateProgress()时,该函数应更新该进度视图的值等于该单元的AudioPlayer当前时间,我得到了错误:
*** Assertion failure in -[UITableView _dequeueReusableCellWithIdentifier:forIndexPath:usingPresentationValues:]
使用计时器每0.5秒运行一次updateProgres(),这是我检查btnPressed
bool是否为true或false的方式(也许有更好的方法吗?)。我用来处理整个过程的唯一功能是segueBtn()(位于TableViewCell.swift类中),updateProgress()(位于TableView.swift类中)和ViewDidLoad()(位于ViewController.swift类中)。这些是这些功能:
ViewController.swift:
override func viewDidLoad()
{
super.viewDidLoad()
parseCSV()
Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(FirstViewController.updateProgress), userInfo: nil, repeats: true)
}
func updateProgress() {
if btnPressed == true {
// Isolate Current Cell
cell = tableView(myTableView, cellForRowAt: cellIndex) as! CustomTableViewCell
if audioPlayer.isPlaying {
cell.progressView.setProgress(Float(audioPlayer.currentTime/audioPlayer.duration), animated: true)
}
else {
cell.progressView.setProgress(Float(audioPlayer.currentTime), animated: false)
}
}
}
TableViewCell.swift:
@IBAction func segueBtn(_ sender: Any) {
do
{
cellIndex = (indexPath)!
let audioPath = Bundle.main.path(forResource: songs[(indexPath?.row)!], ofType: ".mp3")
try audioPlayer = AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: audioPath!) as URL)
audioPlayer.prepareToPlay()
// Indicates to updateProgress() that audio player is set up
btnPressed = true
audioPlayer.play()
}
catch
{
print ("Audio Player was not set up correctly")
}
}
有什么办法可以使用这种策略更新正确单元格的progressView?