滚动可用单元格后,为什么UITableViewCell显示错误的数据?

时间:2016-05-21 09:18:42

标签: ios swift uitableview

我正在为iOS制作一个下载管理器,但问题是当我滚动屏幕后,单元格超出它们可以放入屏幕的时间,它开始为示例提供错误的数据:

  • 在表格视图开头的完成/暂停/正在进行的下载 滚动 后,它可能会显示在第一个可见行或最后一个

这是代码:

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

    let cell = tableView.dequeueReusableCellWithIdentifier("downloadCell", forIndexPath: indexPath) as! RCHDownloadAddictTableViewCell

    updateCell(cell, forRowAt: indexPath)

    return cell
}

func updateCell(cell: RCHDownloadAddictTableViewCell, forRowAt indexPath: NSIndexPath) {

    let arrayInfo = downloadingArray[indexPath.row]

    cell.cellProgressView.setProgress((arrayInfo.downloadProgress)!, animated: true)
    cell.cellFileName.text = arrayInfo.fileName
    cell.cellDownloadSpeed.text = String(format: "%.1fMB", (arrayInfo.downloadSize / 1000000))
    cell.cellBlock = {

        if (arrayInfo.downloadTask.state == NSURLSessionTaskState.Running) {
            arrayInfo.downloadTask.suspend()
            cell.cellButton.setImage(UIImage(named: "resume.png"), forState: UIControlState.Normal)
        } else if (arrayInfo.downloadTask.state == NSURLSessionTaskState.Suspended) {
            arrayInfo.downloadTask.suspend()
            cell.cellButton.setImage(UIImage(named: "resume.png"), forState: UIControlState.Normal)
        }

    }

    if (arrayInfo.didFinishDownload == true) {
        cell.cellButton.hidden = true
        cell.cellFinishIndicator.text = "Finished."
        cell.cellProgressView.hidden = true
        cell.cellFinishIndicator.hidden = false
    } else {
        cell.cellButton.hidden = false
        cell.cellProgressView.hidden = false
        cell.cellFinishIndicator.hidden = true
    }
}

更新:观看此视频并关注第一个单元格 https://www.youtube.com/watch?v=S_PnAS5lb7s&feature=youtu.be

2 个答案:

答案 0 :(得分:2)

您已使用dequeueReusableCellWithIdentifier生成单元格。通过该方法,单元被重用,因此系统使用最后生成的单元。 要解决这个问题,你必须实现其他部分,如

cell.cellBlock = {

    if (arrayInfo.downloadTask.state == NSURLSessionTaskState.Running) {
        arrayInfo.downloadTask.suspend()
        cell.cellButton.setImage(UIImage(named: "resume.png"), forState: UIControlState.Normal)
    } else if (arrayInfo.downloadTask.state == NSURLSessionTaskState.Suspended) {
        arrayInfo.downloadTask.suspend()
        cell.cellButton.setImage(UIImage(named: "resume.png"), forState: UIControlState.Normal)
    }else{
        <Write default code here>
    }
}

if (arrayInfo.didFinishDownload == true) {
    cell.cellButton.hidden = true
    cell.cellFinishIndicator.text = "Finished."
    cell.cellProgressView.hidden = true
    cell.cellFinishIndicator.hidden = false
} else {
    cell.cellButton.hidden = false
    cell.cellFinishIndicator.text = "Your text."
    cell.cellProgressView.hidden = false
    cell.cellFinishIndicator.hidden = true
}

答案 1 :(得分:2)

表视图单元通过重用队列重用。如果你看到一次在屏幕上说出7个单元格,当你向下滚动(更多的手指向上),那么移出顶部边界的单元格将从重用的队列传递到底部显示边缘再次。此单元格是初始化实例,此外,您还为该单元格实例上的公共属性设置了一些具体值。 它是一个视觉上消失但仍然在记忆中然后再次出现的对象。你需要做的是在它消失的时刻和它的反应之间进行清理。

正确的地方和方法是:

1)视觉效果,即与.hidden.alpha.backgroundColor或选择状态等UIView属性相关的内容应重置为prepareForReuse重写方法内的所需默认状态你的自定义单元格。不要忘记打电话给超级。

2)对于内容相关的内容,例如下载进度,我建议在单元格上实现自定义公共 reset 方法,在方法内部执行任何您想要的操作不会落入prepareForReuse组,并在您从队列中将单元格从队列中取出后立即在cellForRowAtIndexPath中调用此重置方法。