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 中管理多个进度视图

IOS Swift中进度条和标签的约束

Swift,集合视图和情节提要,在另一个标签上使用 viewWithTag 时为空

滚动时集合视图中的图像变高

如何在1项标签栏控制器中制作顶部标签栏以在swift中显示多个视图控制器?

如何在firebase(swift)中获取子节点的值,并将其显示在视图控制器的标签中