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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UICollectionView接收具有不存在的索引路径的单元格的布局属性相关的知识,希望对你有一定的参考价值。

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

我的两个Collection视图都在UIStackView中

从集合视图中选择元素时,我收到以下错误,其名称为cltnTools

enter image description here

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

            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()

以上是关于UICollectionView接收具有不存在的索引路径的单元格的布局属性的主要内容,如果未能解决你的问题,请参考以下文章

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

具有单元格间距的 UICollectionView 存在滚动问题

具有网络数据的 UICollectionView 在与交互之前不显示单元格

UICollectionView 不刷新

UICollectionView 两个具有相同视图的单元格。第二个单元格不显示任何内容

UICollectionViews 线索内的 UISlider 不接收触摸事件