当 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