UICollectionView.setCollectionViewLayout上的EXC_BAD_ACCESS错误

时间:2018-03-06 03:32:47

标签: swift uicollectionview uicollectionviewlayout

这个让我难过。

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时才会发生这种情况,如果这有帮助的话。

1 个答案:

答案 0 :(得分:0)

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

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之前。我需要仔细考虑这是为什么,但这解决了这个问题。