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错误的主要内容,如果未能解决你的问题,请参考以下文章