UICollectionView.setCollectionViewLayout上的EXC_BAD_ACCESS错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UICollectionView.setCollectionViewLayout上的EXC_BAD_ACCESS错误相关的知识,希望对你有一定的参考价值。

这个让我难过。

func updateCollectionView() {
    DispatchQueue.main.async { [weak self] in
        if let strongSelf = self {
            let layout = UICollectionViewFlowLayout()
            let minimumSpacing: CGFloat = 8
            layout.minimumInteritemSpacing = minimumSpacing
            layout.minimumLineSpacing = minimumSpacing
            let dim = strongSelf.view.frame.width / CGFloat(strongSelf.size) - minimumSpacing
            layout.itemSize = CGSize(width: dim, height: dim)
            strongSelf.collectionView.setCollectionViewLayout(layout, animated: true)
            strongSelf.collectionView.reloadData()
        }
    }
}

当它尝试setCollectionViewLayout时,我得到:

error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0x800000000)

collectionView,strongSelf和layout都是有效的对象。只有当strongSelf.size小于4时才会发生这种情况,如果这有帮助的话。

答案

嗯,这个对我来说很奇怪,但我用这个绅士的帖子解决了它:

http://jaymayu.com/uicollectionview-and-dynamically-changing-layouts-on-runtime/

基本上,我必须这样做:

strongSelf.gridCollectionView.reloadData()
strongSelf.gridCollectionView.collectionViewLayout.invalidateLayout()
strongSelf.gridCollectionView.setCollectionViewLayout(layout, animated: false)

重要的是reloadData()需要在setCollectionViewLayout之前。我需要仔细考虑这是为什么,但这解决了这个问题。

以上是关于UICollectionView.setCollectionViewLayout上的EXC_BAD_ACCESS错误的主要内容,如果未能解决你的问题,请参考以下文章