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
}
}
错误消息: *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“当第 0 节中只有 0 个项目时,尝试将集合视图滚动到越界项目 (0)。集合视图:< UICollectionView:0x7fc5b101f800;帧 = (0 0; 0 0); clipsToBounds = YES; 自动调整大小 = RM+BM;手势识别器 = <NSArray: 0x6000022b9fb0>; 层 = <CALayer: 0x600002cd1540>; 内容偏移:{0, 0}; 内容大小:{0, 0}; 调整内容插入:{0, 0, 0, 0}; 布局:<UICollectionViewFlowLayout:0x7fc5b0912ae0>;数据源:<Decibel_iOS.HomeFeedViewController:0x7fc5b1054200>>。'
解决方案
在您的程序中的某个地方,有人可能正在调用scrollToItems(at:,scrollPosition:)
. 他们要么不知道集合是空的,要么只是(row:0, item:0)
作为索引路径传入,而不是完全跳过滚动调用。或者他们认为您的收藏至少包含一件物品。
为了进一步诊断问题,我要么在异常上设置断点,要么在UIScrollView
函数上设置断点并查看回溯以查看是谁在进行调用。
您还需要检查您的数据源,以确保在滚动发生时它已更新为正确数量的项目。
但是有一个回溯来找出谁或什么导致滚动视图滚动将是一个很好的第一步。
推荐阅读
- javascript - 从源“http://localhost”访问“https://js.stripe.com/v2/”的 XMLHttpRequest 已被 CORS 策略阻止:在 opencart 中
- ansible - 稳定 | 将当前批次中的已完成主机替换为下一批中的主机
- javascript - 在 JEST-Enzyme 中编写测试用例以在构造函数中调用 promise
- postgresql - 无法在带有日期的 jsonb 字段上创建索引
- html - 为什么内部 div 不将自身定位在外部 div 内
- php - Lumen 中未定义获取 Auth guard [web]
- batch-file - 从 bat 文件运行应用程序并继续程序
- reactjs - POST 请求的身份验证错误:“未提供身份验证凭据”使用 Axios,但使用 POSTMAN 工作
- javascript - Javascript array.length 在 d3.csv() 函数中的 .push() 之后返回 0
- google-play-services - 恢复出厂设置 Google Nexus 7 (2013)