滚动到最后一项时 UICollectionView 崩溃

Posted

技术标签:

【中文标题】滚动到最后一项时 UICollectionView 崩溃【英文标题】:UICollectionView crashes when scrolling to last item 【发布时间】:2022-01-19 19:46:29 【问题描述】:

我的应用中有一个ViewController 可以实时获取 cmets。当获取新评论时,我滚动到垂直CollectionView 的底部。问题是我的CrashlyticsscrollToItem 调用上显示了许多崩溃,我自己无法重新创建它。

我无法理解崩溃是如何发生的,因为我已经考虑了所有可能的值。我问CollectionView 它有多少项,如果至少有一项,请滚动到最后一项。

这是我的代码:

fileprivate func handleFetchedCommentsResponse() 
    DispatchQueue.main.async 
        self.chatCollectionView.reloadData()
    
    
    // -------------------------------------------
    
    let numberOfItems = chatCollectionView.numberOfItems(inSection: 0)
    
    if numberOfItems > 0 
        DispatchQueue.main.async 
            self.chatCollectionView.scrollToItem(at: IndexPath(row: numberOfItems, section: 0), at: .bottom, animated: false)
        
    

这是崩溃日志:

致命异常:NSInternalInconsistencyException 试图滚动 当只有 第 0 节中有 20 项。集合视图:;层 = ;内容偏移:0, 568.33333333333337;内容大小:396, 876;调整内容插入:0, 0, 0, 0;布局: ;数据源: >.

PS:我的CollectionView只有一节

【问题讨论】:

【参考方案1】:

如果您的集合视图有 20 个项目,它们将位于第 0 行到第 19 行。尝试滚动到与计数匹配的行将超出视图内容的末尾。

(如果您无法重现问题,我猜您正在使用不会导致实际滚动发生的值进行测试。)

【讨论】:

我之前尝试过numberOfItems-1,但它会滚动到倒数第二个。现在我意识到这是因为at: .bottom。我应该使用的是.top。为了回答您的猜测,我正在使用真实数据进行测试。

以上是关于滚动到最后一项时 UICollectionView 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

删除最后一项时 UICollectionView 崩溃

带有插图的 UICollectionView 不会一直向下滚动

UICollectionView 滚动到没有动画的最后一项

UICollectionView 垂直滚动最后一项

UICollectionView 水平滚动,删除最后一项,动画不起作用

UICollectionView 滚动到下一项