UICollectionView.setContentOffset(...)导致NSRangeException

时间:2019-02-06 11:53:21

标签: ios swift uicollectionview

我有一个UICollectionView代表一个日历,加载时生成了13个月的数据,每个月都有一部分。用户界面中有一个按钮可以在本年度和下一年之间切换,但是当从集合末尾滚动到本年年初时,应用程序崩溃并显示以下错误。

'NSRangeException', reason: '*** -[__NSArrayM objectAtIndexedSubscript:]: index 9223372036854775806 beyond bounds [0 .. 4]'

这是导致错误的方法。

public func scrollTo(year: Int) {
    if let month = months.firstIndex(where: { $0.components.year == year }),
        let attributes = collectionView.layoutAttributesForSupplementaryElement(ofKind: UICollectionElementKindSectionHeader, at: IndexPath(item: 0, section: month)){
        let y = attributes.frame.origin.y - collectionView.contentInset.top

        // This is the line causing the error
        collectionView.setContentOffset(CGPoint(x: 0, y: y), animated: true)
    }
}

我已经尝试打印出我计算出的y值,但是每次崩溃时它都是0

也许值得一提的是,异常中提到的索引等于Int.max - 1,尽管看到yCGFloat,但我不确定这与它们之间的相关性。 / p>

2 个答案:

答案 0 :(得分:0)

为什么不使用此内置的UICollectionView实例方法 scrollToItem(at:at:animated:)与您计算出的索引路径一样?

  

滚动收集视图的内容,直到可见指定的项目。   from apple docs

答案 1 :(得分:0)

我不确定动画是否会导致崩溃,但是在对animated的调用中将false更改为setContentOffset(...)可以解决此问题。