UICollectionView接收具有不存在的索引路径的单元格的布局属性
我使用了两个集合视图,名称是cltnEdits
和cltnTools
,我默认显示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()