swift:在集合视图的标签中显示进度
Posted
技术标签:
【中文标题】swift:在集合视图的标签中显示进度【英文标题】:swift: Show progress in label in collection view 【发布时间】:2018-08-01 05:42:09 【问题描述】:我使用此代码下载文件并在标签中显示下载进度,并在情节提要中创建标签:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! MasterViewCell
let cellFilePath = "\(indexPath.section)\(indexPath.row).png"
let indexOfTask = allDownloadTasks.index (task:URLSessionDownloadTask) -> Bool in
return task.currentRequest?.url?.lastPathComponent == cellFilePath
if indexOfTask == nil
//cell.label?.isHidden = true
return cell
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
let path = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
let documentDirectoryPath:String = path[0]
let fileManager = FileManager()
let destinationURLForFile = URL(fileURLWithPath: documentDirectoryPath.appendingFormat("/file.png"))
if fileManager.fileExists(atPath: destinationURLForFile.path)
animation()
else
let url = URL(string: "link")!
let downloadTaskLocal = self.backgroundSession.downloadTask(with: url)
self.allDownloadTasks.append(downloadTaskLocal) // Add a new task to the array
downloadTaskLocal.resume()
cell.label?.frame = CGRect(x: 70, y: 128, width: 82, height: 21)
cell.label?.isHidden = false
func urlSession(_ session: URLSession,
downloadTask: URLSessionDownloadTask,
didWriteData bytesWritten: Int64,
totalBytesWritten: Int64,
totalBytesExpectedToWrite: Int64)
DispatchQueue.main.async(execute: () -> Void in
if let visibleIndexPath = self.collectionView?.indexPathsForVisibleItems
for visibleIndexPath in visibleIndexPath
if (downloadTask.currentRequest?.url?.lastPathComponent == "\(visibleIndexPath.section)\(visibleIndexPath.row).zip")
var myCell = self.collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: visibleIndexPath) as! MasterViewCell
myCell = self.collectionView?.cellForItem(at: visibleIndexPath) as! MasterViewCell
myCell.label.text = "\(Int(CGFloat(totalBytesWritten) / CGFloat(totalBytesExpectedToWrite) * 100.0))%"
)
但是我有两个问题:
如果我下载了 6 个文件(按 6 个单元格),然后想继续下载不同的文件,然后按下一个单元格。我在单元格中的标签未显示,但下载有效。此外,如果我将在另一个单元格中开始下载,我的下载将可以正常工作,但不会显示标签。如何解决?
如果我在这个单元格中下载了文件并且我的标签 = 100,之后我在下一部分滚动我的收藏视图,我在一些不同的单元格中看到标签 = 100。但我没有在这个单元格中下载文件。
【问题讨论】:
你能显示你的cellforitematindexpath
吗?
@mnemonic23 更新问题。
【参考方案1】:
您的手机正在被重复使用。确保在单元格类中的 prepareForReuse
方法中重置单元格。还要确保存储每个单元格的进度,并在 cellForRowAt
方法中将单元格出列时设置它。
class MasterViewCell
override func prepareForReuse()
label.text = "0" //or whatever is supposed to be value for the default cell.
// Do other operations to clear your cell of any existing data for reused cells.
为了保存进度,只需声明一个变量数组并将该数组中的数据保存在相应的索引处。当您将单元格出列时,请检查数组并使用数组中的值。我看到您有一个名为urlSession
的方法,您可以在其中知道发生进度的单元格的 indexPath。只需将其值存储在该索引处的数组中即可。
【讨论】:
之后我应该使用prepareForReuse
?我需要如何保存进度?
prepareForReuse
是单元格类中的一个方法,当单元格被重用时,可以重写它来执行您需要执行的任何操作。由于您正在重用单元格,因此已更新的单元格可能会显示为新单元格。因此,要获得一个新的单元格,您需要重置标签以及您对单元格所做的任何更改为单元格 prepareForReuse
内的默认值。为了保存进度,您可以在进度值更新时将它们存储在数组中。
你能举个例子吗?在我的情况下如何使用它。因为现在我不太明白何时应该使用prepareForReuse
以及何时保存进度。
编辑了我的答案。
谢谢!请检查一下 - ***.com/questions/51629230/…【参考方案2】:
您正在重复使用单元格,所以它正在发生。您必须为单元格正确创建数据源。例如,您可以创建一个Download
类,并且在该类中您必须拥有有关下载及其进度的所有信息。只有在这个类中,您必须编写下载代码和进度跟踪。您应该将此类对象数组用于您的单元格数据源,以便获得所有信息。与重用单元时的下载有关。请检查以下链接,这将帮助您做到这一点。
https://www.raywenderlich.com/158106/urlsession-tutorial-getting-started
【讨论】:
以上是关于swift:在集合视图的标签中显示进度的主要内容,如果未能解决你的问题,请参考以下文章
Swift,集合视图和情节提要,在另一个标签上使用 viewWithTag 时为空