由于滚动刷新时空集合视图崩溃
Empty collection view crashes when refreshing due to scrolling
我的水平集合视图(仅当它有 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
}
}
错误信息:
*** 由于未捕获的异常 'NSInternalInconsistencyException' 而终止应用程序,原因:'Attempted to scroll the collection view to an out-of-bounds item (0) when there are only 0 items in section 0. Collection view: <UICollectionView: 0x7fc5b101f800; frame = (0 0; 0 0); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x6000022b9fb0>; layer = <CALayer: 0x600002cd1540>; contentOffset: {0, 0}; contentSize: {0, 0}; adjustedContentInset: {0, 0, 0, 0}; layout: <UICollectionViewFlowLayout: 0x7fc5b0912ae0>; dataSource: <Decibel_iOS.HomeFeedViewController: 0x7fc5b1054200>>.'
您程序中的某处可能有人正在调用 scrollToItems(at:,scrollPosition:)
。他们要么不知道 collection 是空的,只是将 (row:0, item:0)
作为索引路径传入,而不是完全跳过滚动调用。或者他们认为您的 collection 至少包含一项。
为了进一步诊断问题,我要么在异常上设置断点,要么在 UIScrollView
函数上设置断点,然后查看回溯以查看调用者是谁。
您还想检查您的数据源,以确保它在滚动发生时已使用正确数量的项目进行了更新。
但是,通过回溯找出导致 scrollview 滚动的原因或原因将是很好的第一步。
我的水平集合视图(仅当它有 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
}
}
错误信息: *** 由于未捕获的异常 'NSInternalInconsistencyException' 而终止应用程序,原因:'Attempted to scroll the collection view to an out-of-bounds item (0) when there are only 0 items in section 0. Collection view: <UICollectionView: 0x7fc5b101f800; frame = (0 0; 0 0); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x6000022b9fb0>; layer = <CALayer: 0x600002cd1540>; contentOffset: {0, 0}; contentSize: {0, 0}; adjustedContentInset: {0, 0, 0, 0}; layout: <UICollectionViewFlowLayout: 0x7fc5b0912ae0>; dataSource: <Decibel_iOS.HomeFeedViewController: 0x7fc5b1054200>>.'
您程序中的某处可能有人正在调用 scrollToItems(at:,scrollPosition:)
。他们要么不知道 collection 是空的,只是将 (row:0, item:0)
作为索引路径传入,而不是完全跳过滚动调用。或者他们认为您的 collection 至少包含一项。
为了进一步诊断问题,我要么在异常上设置断点,要么在 UIScrollView
函数上设置断点,然后查看回溯以查看调用者是谁。
您还想检查您的数据源,以确保它在滚动发生时已使用正确数量的项目进行了更新。
但是,通过回溯找出导致 scrollview 滚动的原因或原因将是很好的第一步。