如何在返回查看 swift 时停止 collection 触发代码

How to stop collection triggering code when scrolling back in to view swift

我很新,如果我的标题没有正确表述,我深表歉意。我一直在努力,一直没能找到这个问题的答案。

我有水平滚动条collection。我正在尝试根据 Firestore 数组中保存的投票数据,以编程方式将 CGRect 添加到 collection 中的相关项目来直观地显示投票结果。

这是可行的,但问题是当您滚动离开(因此 collection 中的项目不在屏幕上)然后返回时,绘制 CGRects 的代码会再次触发并添加更多图形到视图。有没有办法在用户将项目滚动到屏幕外时删除这些 CGRects collection,以便当用户将项目滚动回视图时,再次触发代码它不会创建重复项?

这是显示第一次和第二次加载的几个屏幕截图

这是我的代码(单元格 b 是触发 CGrect 的地方)

//COLLECTION VIEW CODE    
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        if collectionView == self.sentCollectionView {
            let cellA = collectionView.dequeueReusableCell(withReuseIdentifier: "sCell", for: indexPath) as! SentCollectionViewCell
            
            cellA.sentQuestionLabel.text = sentMessages[indexPath.row].shoutText
            // Set up cell
            return cellA
        }
        else {
            let cellB = receivedCollectionView.dequeueReusableCell(withReuseIdentifier: "pCell", for: indexPath) as! ReceivedCollectionViewCell
            
            receivedMessages[indexPath.row].pollTotal = receivedMessages[indexPath.row].pollResults.reduce(0, +)
            print("Sum of Array is : ", receivedMessages[indexPath.row].pollTotal!)
            cellB.receivedShoutLabel.text = receivedMessages[indexPath.row].shoutText
            
            print(receivedMessages[indexPath.row].pollResults.count)
            
            if receivedMessages[indexPath.row].pollResults != [] {
                for i in 0...receivedMessages[indexPath.row].pollResults.count - 1 {
                    cellB.resultsView.addSubview(sq(pollSum: receivedMessages[indexPath.row].pollTotal!, pollResult: receivedMessages[indexPath.row].pollResults[i]))
                }
            }

            return cellB
        }
    }

//THIS DRAWS THE CGRECT
    func sq(pollSum: Int, pollResult: Int) -> UIView {
        // divide the width by total responses
        let screenDivisions = Int(view.frame.size.width) / pollSum

        // the rectangle top left point x axis position.
        let xPos = 0
        
        // the rectangle width.
        let rectWidth = pollResult * screenDivisions
        
        // the rectangle height.
        let rectHeight = 10
        
        // Create a CGRect object which is used to render a rectangle.
        let rectFrame: CGRect = CGRect(x:CGFloat(xPos), y:CGFloat(yPos), width:CGFloat(rectWidth), height:CGFloat(rectHeight))
        
        // Create a UIView object which use above CGRect object.
        let greenView = UIView(frame: rectFrame)
        
        // Set UIView background color.
        greenView.backgroundColor = UIColor.green
        
        //increment y position
        yPos = yPos + 25
        
        return greenView
        
    }

集合单元格已出列 dequeueReusableCell ,您需要覆盖 prepareForReuse

或设置标签

greenView.tag = 333

并在 cellForItemAt 内执行此操作

cellB.resultsView.subviews.forEach {  
   if [=11=].tag == 333 {
      [=11=].removeFromSuperview()
    }
}
if receivedMessages[indexPath.row].pollResults != [] {
    for i in 0...receivedMessages[indexPath.row].pollResults.count - 1 {
        cellB.resultsView.addSubview(sq(pollSum: receivedMessages[indexPath.row].pollTotal!, pollResult: receivedMessages[indexPath.row].pollResults[i]))
    }
}