ios - 为什么 UITableViewCell 在滚动可用单元格后显示错误数据?

标签 ios swift uitableview

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

  • 在表格 View 开始时完成/暂停/正在进行的下载滚动后它可能会显示在第一行或最后一行

代码如下:

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

最佳答案

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

正确的位置和方法是这样的:

1) 视觉效果,即与 UIView 属性相关的东西,如 .hidden.alpha.backgroundColor 或选择状态应重置为所需prepareForReuse 中的默认状态自定义单元格中的覆盖方法。不要忘记调用 super。

2) 对于内容相关的东西,比如下载进度,我建议在单元格上实现一个custom public reset method,在方法内部做无论你想要什么,不属于 prepareForReuse 组,并在你从队列中取出单元格后立即在 cellForRowAtIndexPath 中调用这个重置方法。

关于ios - 为什么 UITableViewCell 在滚动可用单元格后显示错误数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37361048/

相关文章:

ios - 为什么我的阴影层位置不正确?

iOS 10 服务扩展不一致

swift - 为什么我不能让 SDWebImage 与 swift 一起工作?

ios - 快速子类化 SKSpriteNode 访问错误

ios - UITableViewCell 中的 UILabel - 切断信息

objective-c - RestKit - POST 响应对象映射

ios - AFNetworking 3.1.0 和调度组

swift - 如何在预览中设置环境对象

iphone - UITableView的编辑风格-添加/删除

iOS - TableView 和 TableView Controller 有什么区别