这是我在使用iOS 9和10的设备上遇到的错误:
***因未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'请求数量为 第9223372036854775807节之前的项目只有1 集合视图中的部分'
这个错误对我来说似乎很清楚,但是我无法理解为什么在iOS 11的设备上没有发生这种情况。
我不知道如何解决它。
这是我的代码:
extension MainTileViewController: MainForecastsDelegate {
func mainForecasts(_ forecastVC: MainForecastsViewController!, didChangeWith object: Any!) {
if let cell = self.outletWeatherForecastCollectionView.cellForItem(at: self.currentIndexPath) as? MainTileCollectionViewCell {
// Some stuff...
}
}
崩溃发生在这里。这是用户切换日等时触发的协议方法......
显然我的currentIndexPath存在问题。
这是我的初始化:
var currentIndexPath : IndexPath = []
在viewDidLoad中:
self.currentIndexPath = IndexPath(item: 0, section: 0)
如何保护我的代码以免它崩溃?你能解释一下来自iOS 9/10的collectionView与iOS 11之间的变化行为(预取除外)。
答案 0 :(得分:2)
正在发生的事情是currentIndexPath = []
设置没有为其item
或section
分配任何值;它创造了一个空的" IndexPath(IndexPath对象基本上是任意长度的元组或值数组,可以这样创建/操作)。尝试以这种方式使用它的任何代码(例如将其传递给cellForItem
调用)都可能具有潜在的未定义行为。看起来某些东西有效地将缺少的section
值解释为-1,然后其他东西将-1解释为unsigned 64-bit integer。
相反,如果您想使用现有的相同通用逻辑,我建议将indexPath
声明为可选:
var currentIndexPath: IndexPath?
然后,在currentIndexPath的用法中使用if-let语法:
extension MainTileViewController: MainForecastsDelegate {
func mainForecasts(_ forecastVC: MainForecastsViewController!, didChangeWith object: Any!) {
if let currentIndexPath = currentIndexPath,
let cell = outletWeatherForecastCollectionView.cellForItem(at: currentIndexPath) as? MainTileCollectionViewCell {
// Some stuff...
}
}
这遵循斯威夫特的习语,并明确表示你从"未知"开始。索引路径。
但是 - 作为@picciano's answer suggests,您可能需要重新考虑整体设计,以更好地适应iOS应用程序的更大设计模式。
答案 1 :(得分:0)
我建议稍微改变一下你的方法。让您的集合视图单元子类负责更新自身,可能来自通知。尝试保留索引路径或对单元格的引用将始终存在问题,因为它们可能会被重用。