当 uitableview 滚动时,UIProgressView 显示在错误的行上

UIProgressView shows on incorrect row when uitableview is scroll

UITableView 中,我有一个带有下载按钮的自定义单元格。点击下载按钮后,我用 indexPath.row 更新标签,下载功能进度视图显示在该单元格中。问题是当用户滚动并且单元格变得不可见时,特定的进度视图开始显示在不同的单元格中。

这是我的 cellForRowAtIndexPath 函数:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    var  cell:CellWithDownload! = tableView.dequeueReusableCellWithIdentifier("CellWithDownload") as CellWithDownload
    var title = rowDataAll[indexPath.row].valueForKey("BayanTitle") as String
    cell.TitleLabel.text = title
    cell.AuthorLabel.text = rowDataAll[indexPath.row].valueForKey("Artist") as? String
    var countOfLikesString = 
    cell.downloadButton.tag = indexPath.row
    cell.downloadButton.addTarget(self, action: Selector("downloadAudio:"), forControlEvents: UIControlEvents.TouchUpInside)

    // If cell becomes visible again, then star        

    if let isDownloading = rowDataAll[indexPath.row].valueForKey("isDownloading") {

        if (isDownloading as NSString == "true") {
            cell.showDownloading()
            cell.progressView.progress = getDownloadObjectWithURL(url).progress
        } else if (isDownloading as NSString == "completed") {                
            cell.hideDownloading()                
        }
    }        
    return cell
}

请指教

最有可能的问题是,您没有在重复使用后重新初始化单元格。当您将一个新单元格出队时,它可能会重新使用刚刚滚出屏幕的单元格之一。如果显示进度条并且您从未将出队单元格初始化为没有进度条,那么只要您重新使用有进度条的单元格,它就会出现。

所以我认为您只需要确保在将单元格出列后初始化单元格。

在您的 cellForRowAtIndexPath 中,我认为您需要添加一个 else 语句来处理未下载且未设置进度条的单元格:

if let isDownloading = rowDataAll[indexPath.row].valueForKey("isDownloading"){
   <Your existing code seems to setup the progress bar here>
}
else{
   <Set it to have no pogress bar in here.>
   cell.hideDownloading()
}