根据索引路径更新UITableView中的progressView

时间:2018-07-12 18:53:10

标签: ios swift uitableview uibutton uiprogressview

我正在开发一个音频播放器应用程序,该应用程序应允许用户在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?

0 个答案:

没有答案