iOS - NSInternalInconsistencyException发生在iOS 9和10上,但在iOS 11上正常运行

时间:2017-12-07 15:39:40

标签: ios swift uicollectionview indexpath

这是我在使用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之间的变化行为(预取除外)。

2 个答案:

答案 0 :(得分:2)

正在发生的事情是currentIndexPath = []设置没有为其itemsection分配任何值;它创造了一个空的" 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)

我建议稍微改变一下你的方法。让您的集合视图单元子类负责更新自身,可能来自通知。尝试保留索引路径或对单元格的引用将始终存在问题,因为它们可能会被重用。