当 UITableView 单元格中的进度条不可见时,如何更新它们

Posted

技术标签:

【中文标题】当 UITableView 单元格中的进度条不可见时,如何更新它们【英文标题】:How can I update the progress bar in the UITableView cells when they are not visible yet 【发布时间】:2020-09-05 06:51:14 【问题描述】:

我遇到了一个问题:我有一个表格视图,其中显示了云存储中的用户文件列表。通过单击单元格上的按钮,我已成功实现将这些文件下载到设备。点击后,单元格上会出现一个进度条,显示文件下载的进度。 现在我需要通过单击“全部下载”按钮来实现下载所有文件的功能。但是我遇到了一个问题:我可以将所有文件一起下载,但是我无法在表格视图之外的那些单元格中显示下载进度。即使单元格不可见,我也希望进度条显示当前进度。当我向下滚动表格视图以便出现新单元格时,我会看到当前的加载进度。我怎样才能做到这一点?我尝试了很多选项,但没有一个能正常工作。 您现在可以在下面看到我的代码:

class SourceFileListViewController: UIViewController 
    private var isDownloadAllButtonPressed: Bool = false
    private var cellsWithFilesIndexPathes: [IndexPath] = []
    private var currentProgress: [IndexPath : Double] = [:]
    ...
    @objc private func barButtonAction() 
    isDownloadAllButtonPressed = true
    for indexPath in cellsWithFilesIndexPathes 
        fileListSource?.downloadFile(path: fileListSource?.files[indexPath.row].path,
                                     pathComponent: fileListSource?.files[indexPath.row].name,
                                     completion:  progress in
                                        self.currentProgress[indexPath] = progress
                              
        , callback: 
            self.getTrackNames 
                self.tableView.reloadRows(at: [indexPath], with: .automatic)
            
        )
    


extension SourceFileListViewController: UITableViewDelegate, UITableViewDataSource 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: SourceFileListCell.reuseId,
                                                 for: indexPath) as! SourceFileListCell
        cell.progressBar.isHidden = true
        cell.delegate = self
        cell.progressBar.setProgress(to: 0)
        ....
        //Here I check the file this or folder
        let entry = fileListSource?.unreformedFileList[indexPath.row]
        switch entry 
        case _ as Files.FileMetadata:
            cell.downloadButton.isHidden = false
            cell.artworkImageView.image = UIImage(systemName: "music.note")

            //If this is a file, I put its indexPath in an array so that it can be downloaded by the Download All button
            cellsWithFilesIndexPathes.append(indexPath)
            if isDownloadAllButtonPressed 
            cell.progressBar.isHidden = false
            guard let progress = currentProgress[indexPath] else  return cell 
            cell.progressBar.setProgress(to: progress)
        
        case _ as Files.FolderMetadata:
            cell.downloadButton.isHidden = true
            cell.artworkImageView.image = UIImage(systemName: "folder.fill")
        default:
            break
        
        
        //Here I check if there is such a file in the user library
        guard let fileName = fileListSource?.files[indexPath.row].name else  return cell 
        if trackNames.contains(fileName) 
            cell.downloadButton.setImage(UIImage(systemName: "checkmark.circle.fill"), for: .normal)
         else 
            cell.downloadButton.setImage(UIImage(systemName: "icloud.and.arrow.down"), for: .normal)
        
        
        return cell
        
    

【问题讨论】:

正如 Lalo 所说,您需要在每个数据源对象中保持下载进度,而不是在单元格中。这样当cellForRowAt被调用时,你就可以设置单元格与来自数据源的下载进度信息 我创建了一个字典 [IndexPath : Double],并将 indexPath 上的当前进度保存到其中,但是当在 cellForRowAt func 中创建单元格时,我无法获得动态进度。我的进度一开始是 0,然后变成 100,我看不到任何进展。我怎样才能得到它? 我已将当前代码添加到问题中 【参考方案1】:

您的数据源需要存储当前进度,以便您可以在cellForRowAt:IndexPath:中调用cell.progressBar.setProgress

您可以使用初始值为0 的项目数初始化一个数组,并在downloadFile 完成块中使用新进度更新indexPath.row 处的数组。

【讨论】:

当我向下滚动表格视图并且有不可见的单元格时,进度会出现在他们的进度条中并且会继续增加吗?还是我需要重新加载它们?

以上是关于当 UITableView 单元格中的进度条不可见时,如何更新它们的主要内容,如果未能解决你的问题,请参考以下文章

当 UITableView 单元格中的 UITextView 大小增加时,节标题重复

UITableView 单元格中的 UITextField 以编程方式成为FirstResponder

UITableView 的单元格中的 iOS Swift Like 按钮

更新 UITableView 单元格中的特定按钮图像

UITableView 中的阴影不一致

UIButton 在 TableView 单元格中不可见