UICollectionView接收具有不存在的索引路径的单元格的布局属性

我使用了两个集合视图,名称是cltnEditscltnTools ,我默认显示cltnTools 。 当用户点击cltnTools任何项目时,会出现cltnEdits集合视图,否则它将被隐藏。 有一个带cltnEdits取消按钮,每当用户点击取消按钮时, cltnEdits消失(隐藏)并出现cltnTools

我的两个Collection视图都在UIStackView中

从集合视图中选择元素名称为cltnTools时出现以下错误。

在此处输入图像描述

我尝试了以下代码来解决此错误,但它不适合我

  cltnEdits.reloadData() cltnEdits.collectionViewLayout.invalidateLayout() cltnEdits.layoutSubviews() cltnTools.reloadData() cltnTools.collectionViewLayout.invalidateLayout() cltnTools.layoutSubviews() 

并试过这个

 override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() cltnEdits.collectionViewLayout.invalidateLayout() } 

并添加了此UICollectionViewDelegateFlowLayout委托

 func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool { return true } 

以下是我对cltnTools的 didSelect方法

  func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { if collectionView == cltnTools { selectedItem.push(item: "CltnTools") switch indexPath.row { case 0: //Edits arrImage = arrEditToolsImage arrText = arrEditToolsText selectedItem.push(item: arrMainToolsText[indexPath.row]) viewCrop.image = imgImage.image cltnEdits.reloadData() cltnEdits.collectionViewLayout.invalidateLayout() cltnEdits.layoutSubviews() toolsToEdits() break case 1: //Effect selectedItem.push(item: arrMainToolsText[indexPath.row]) arrImage = arrEffectToolsImage arrText = arrEffectToolsText cltnEdits.reloadData() cltnEdits.collectionViewLayout.invalidateLayout() cltnEdits.layoutSubviews() toolsToEdits() break case 2: //Colors selectedItem.push(item: arrMainToolsText[indexPath.row]) arrImage = arrColorToolsImage cltnEdits.reloadData() cltnEdits.collectionViewLayout.invalidateLayout() cltnEdits.layoutSubviews() toolsToEdits() break case 3: //Text selectedItem.push(item: arrMainToolsText[indexPath.row]) arrImage = arrTextToolsImage arrText = arrTextToolsText imgImage.addLabel() //Modify the Label imgImage.textColor = UIColor.black imgImage.textAlpha = 1 imgImage.currentlyEditingLabel.closeView!.image = #imageLiteral(resourceName: "Delete") imgImage.currentlyEditingLabel.rotateView?.image = #imageLiteral(resourceName: "Resize") imgImage.currentlyEditingLabel.border?.strokeColor = UIColor.black.cgColor cltnEdits.reloadData() cltnEdits.collectionViewLayout.invalidateLayout() cltnEdits.layoutSubviews() toolsToEdits() break case 4: //Frame selectedItem.push(item: arrMainToolsText[indexPath.row]) print("Frame \(arrFrameToolsImage.count)") arrImage = arrFrameToolsImage cltnEdits.reloadData() cltnEdits.collectionViewLayout.invalidateLayout() cltnEdits.layoutSubviews() toolsToEdits() break case 5: //Goodies selectedItem.push(item: arrMainToolsText[indexPath.row]) arrImage = arrGoodiesToolsImage print("Goodies \(arrGoodiesToolsImage.count)") cltnEdits.reloadData() cltnEdits.collectionViewLayout.invalidateLayout() cltnEdits.layoutSubviews() toolsToEdits() break default: break } } 

我该如何解决我的错误? 有人请帮忙!

注意:在将其标记为重复之前,请检查我的代码,我已经尝试了在堆栈上的其他问题中给出的所有解决方案。

尝试交换reloadData()invalidateLayout() ,另外不要直接调用layoutSubviews (参见docs )

 cltnEdits.collectionViewLayout.invalidateLayout() cltnEdits.reloadData() cltnEdits.setNeedsLayout() cltnEdits.layoutIfNeeded() cltnTools.collectionViewLayout.invalidateLayout() cltnTools.reloadData() cltnTools.setNeedsLayout() cltnTools.layoutIfNeeded()