由于滚动而刷新时,空集合视图崩溃

Dav*_*vid 5 xcode uicollectionview swift

我的水平集合视图(仅当它有 0 个单元格时)在尝试刷新父视图时导致崩溃。当集合视图有 0 个项目(即“shownStations”)时,集合视图被隐藏。刷新父视图时,将进行 API 调用以获取集合视图的任何可用项目。与错误消息(如下)相关的集合视图的代码如下:

        if self.shownStations.isEmpty {  
            self.stationCollectionView?.frame = CGRect(x: 0, y: 0, width: 0, height: 0)
        } else {
            self.stationCollectionView?.frame = CGRect(x: 0, y: 0, width: 414, height: 150)
        }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        if !self.hiddenStations.isEmpty {
            return shownStations.count + 1
        } else {
            return shownStations.count
        }
    }
Run Code Online (Sandbox Code Playgroud)

错误消息: *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“当第 0 节中只有 0 个项目时,尝试将集合视图滚动到越界项目 (0)。集合视图:< UICollectionView:0x7fc5b101f800;帧=(0 0;0 0);剪辑边界=是;自动调整大小 = RM+BM; 手势识别器 = <NSArray: 0x6000022b9fb0>; 层 = <CALayer: 0x600002cd1540>; 内容偏移: {0, 0}; 内容大小: {0, 0}; 调整内容插入: {0, 0, 0, 0}; 布局:<UICollectionViewFlowLayout:0x7fc5b0912ae0>;数据源:<Decibel_iOS.HomeFeedViewController:0x7fc5b1054200>>。'

Sco*_*son 6

在你的程序中的某个地方可能有人正在调用scrollToItems(at:,scrollPosition:)。他们要么不知道集合是空的,只是作为索引路径传入,(row:0, item:0)而不是完全跳过滚动调用。或者他们认为您的收藏至少包含一件物品。

为了进一步诊断问题,我要么在异常上设置断点,要么在函数上设置断点UIScrollView并查看回溯以查看是谁在进行调用。

您还需要检查数据源,以确保在滚动发生时已使用正确数量的项目进行更新。

但是,通过回溯来找出是谁或是什么导致滚动视图滚动将是一个很好的第一步。