我是新加入UICollectionView的。我正在尝试使用以下代码将UICollectionViewLayout从网格切换到列表,反之亦然:
@IBAction func switchLayout(sender: AnyObject) {
isGridLayout = !isGridLayout
collectionView?.reloadData()
if isGridLayout {
collectionView?.performBatchUpdates({ () -> Void in
self.collectionView?.collectionViewLayout.invalidateLayout()
self.collectionView?.setCollectionViewLayout(self.gridLayout, animated: true)
}, completion: { (completion) -> Void in
})
} else {
collectionView?.performBatchUpdates({ () -> Void in
self.collectionView?.collectionViewLayout.invalidateLayout()
self.collectionView?.setCollectionViewLayout(self.listLayout, animated: true)
}, completion: { (completion) -> Void in
})
}
}我一直在setCollectionViewLayout:animated:方法上看到下面的崩溃,我不明白。任何帮助修复这个崩溃将是伟大的!
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: <NSIndexPath: 0xc000000000000016> {length = 2, path = 0 - 0})'该项目在github中可用。它是此tutorial的修改后的形式。
发布于 2017-08-01 12:45:18
因为您在FlowLayout中设置了headerReferenceSize。这意味着collectionView将有一个补充视图。
因此,注释掉headerReferenceSize的代码或在ViewController中实现collectionView(_:viewForSupplementaryElementOfKind:at:)。
发布于 2016-03-24 22:51:48
我也遇到过类似的问题,最后我没有在UICollectionViewLayoutAttributes子类中实现layoutAttributesForItemAtIndexPath()。
这是我的实现
override func prepareLayout() {
super.prepareLayout()
if let numberOfItems = self.collectionView?.numberOfItemsInSection(0) {
var left: CGFloat = self.sectionInset.left
let centerY = CGRectGetMidY((self.collectionView?.bounds)!)
for item in 0..<numberOfItems {
let itemFrame = CGRect(origin: CGPoint(x: left, y: centerY - (self.itemSize.height / 2)), size: self.itemSize)
let attributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: NSIndexPath(forItem: item, inSection: 0))
attributes.size = ITEM_SIZE
attributes.frame = itemFrame
attributes.alpha = 1
attributes.zIndex = 1
attributes.hidden = false
self.layoutAttributes.append(attributes)
left += self.itemSize.width + self.minimumInteritemSpacing
}
let contentWidth: CGFloat = self.sectionInset.left + (CGFloat(numberOfItems) * (self.itemSize.width + self.minimumInteritemSpacing) - self.minimumInteritemSpacing) + self.sectionInset.right
self.contentSize = CGSize(width: contentWidth, height: (self.collectionView?.bounds.height)!)
}
}
override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? {
return self.layoutAttributes[indexPath.item]
}
override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
var validAttributes = [UICollectionViewLayoutAttributes]()
for attributes in self.layoutAttributes {
if CGRectIntersectsRect(attributes.frame, rect) {
validAttributes.append(attributes)
}
}
return validAttributes
}
override func collectionViewContentSize() -> CGSize {
return self.contentSize
}https://stackoverflow.com/questions/30227049
复制相似问题