首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 8 UICollectionViewLayout交换机在Swift中神秘崩溃

iOS 8 UICollectionViewLayout交换机在Swift中神秘崩溃
EN

Stack Overflow用户
提问于 2015-05-14 07:47:58
回答 2查看 1.3K关注 0票数 5

我是新加入UICollectionView的。我正在尝试使用以下代码将UICollectionViewLayout从网格切换到列表,反之亦然:

代码语言:javascript
复制
@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:方法上看到下面的崩溃,我不明白。任何帮助修复这个崩溃将是伟大的!

代码语言:javascript
复制
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: <NSIndexPath: 0xc000000000000016> {length = 2, path = 0 - 0})'

该项目在github中可用。它是此tutorial的修改后的形式。

EN

回答 2

Stack Overflow用户

发布于 2017-08-01 12:45:18

因为您在FlowLayout中设置了headerReferenceSize。这意味着collectionView将有一个补充视图。

因此,注释掉headerReferenceSize的代码或在ViewController中实现collectionView(_:viewForSupplementaryElementOfKind:at:)

票数 2
EN

Stack Overflow用户

发布于 2016-03-24 22:51:48

我也遇到过类似的问题,最后我没有在UICollectionViewLayoutAttributes子类中实现layoutAttributesForItemAtIndexPath()。

这是我的实现

代码语言:javascript
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30227049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档