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 个项目?的主要内容,如果未能解决你的问题,请参考以下文章