Swift 集合视图不会添加超过 6 个项目?

Posted

技术标签:

【中文标题】Swift 集合视图不会添加超过 6 个项目?【英文标题】:Swift collection view won't add more than 6 items? 【发布时间】:2017-03-10 21:40:23 【问题描述】:

好的,我对这里的集合视图以及它们如何不断实例化单元格缺乏了解。我将 MsStickerViews 与该视图的本地描述(名称)一起添加到我的集合视图中。理想情况下,我只想这样做一次(不是每次用户滚动时)。据我了解,标准的集合视图功能

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

每次用户滚动并会调用;只需一次又一次地添加您在此功能中添加的任何内容。为了解决这个问题,我创建了一个单独的类StickerCollectionViewCell,其中有这些初始化函数:

public var animalName = String()
    var logoLabel = UILabel()
    public var hasSticker = Bool(false)
public func initSticker(stickerView: MSStickerView)
    
            print("PUTTING: ",stickerView.sticker?.localizedDescription)
            self.addSubview(stickerView)
            stickerView.startAnimating()
    

    public func initLabels()
    
        //print("called", animalName)
        logoLabel.frame = CGRect(x: 0, y: 0, width: self.bounds.width, height: 100)
        logoLabel.textColor = UIColor.black
        logoLabel.textAlignment = .center
        //logoLabel.text = stickerPack[indexPath.item].sticker?.localizedDescription.uppercased()
        logoLabel.text = animalName.uppercased()
        logoLabel.font = UIFont(name: "Futura-Bold", size: screenSize.height * (9.8/screenSize.height))
        logoLabel.center = CGPoint(x: self.bounds.width * 0.5, y: self.bounds.height * 0.96)
        self.addSubview(logoLabel)
    

然后我像这样添加我的单元格:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

        // get a reference to our storyboard cell
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "stickerCell", for: indexPath as IndexPath) as! StickerCollectionViewCell

            cell.backgroundColor = UIColor.clear// make cell more visible in our example project

        if(cell.hasSticker == false && animalNames.contains((stickerPack[indexPath.item].sticker?.localizedDescription)!) == false)
        
            cell.initSticker(stickerView: stickerPack[indexPath.item])
            cell.animalName = (stickerPack[indexPath.item].sticker?.localizedDescription)!
            cell.initLabels()

            animalNames.append(cell.animalName)
            cell.hasSticker = true;
        
         print("Animal names", animalNames)

        return cell
    

if 语句的原因是我从一个名称数组中添加我的贴纸视图,直到今天我在数组中只有 6 个名称。现在有了 7,它开始将数组中的最后一项添加到另一个单元格的顶部,即使我数了数,它仍然会产生 7 个单元格。

布尔值和存储已用完名称的数组有助于现在它们不重叠,但永远不会添加最后一项。它不会被放入已用完的名称数组中。当我滚动时,单元格中的贴纸会移动,这意味着当我滚动到底部时,顶部的贴纸将位于底部。

我检查并创建了正确数量的单元格:

 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        print("COUNT",self.animalsAnim.count)
        return self.animalsAnim.count
    

我不知道是什么原因造成的。我怎样才能停止这种细胞的持续刷新?为什么我的字符串数组中的最后一项不会被添加?怎么了?

【问题讨论】:

你不想要那个if 声明。 celForRowAt 将在collectionview 滚动时需要一个单元格时调用。您可以将以前使用过的单元格对象出列。您的代码需要根据 indexpath 设置所有适当的视图 【参考方案1】:

使用不同/更好的方法。

在情节提要中创建一个单元格模板。将模板中单元格的类设置为您的自定义类。将您需要的字段添加到单元格,并使用插座将它们连接到单元格。然后摆脱所有将自定义字段添加到单元格的代码。只需在 cellForItemAt 方法中将值安装到已添加的单元格字段中即可。

【讨论】:

【参考方案2】:

啊,没关系。这有效:

override func prepareForReuse() 
        super.prepareForReuse()

        for view in self.subviews
            view.removeFromSuperview()
        
    

【讨论】:

这行得通,但效率不高。由于您已经有一个自定义单元格类,请在情节提要中创建一个单元格模板,将其类设置为您的自定义类,并在其中添加您需要的字段。然后将它们连接到带有插座的自定义类。现在,您的单元格将在创建后立即拥有所需的字段,并且您不会在每次滚动时都在单元格中添加和删除字段。

以上是关于Swift 集合视图不会添加超过 6 个项目?的主要内容,如果未能解决你的问题,请参考以下文章

swift中集合视图单元格内的按钮操作

集合视图不会重新加载(Swift)

Swift:集合视图未正确调整以更改大小

Swift UI 集合视图布局

如何使用 Swift 在集合视图单元格中添加表视图?

在表格视图单元格中添加集合视图 swift 3