iOS- nSinternalIncistencyException在iOS 9和10上发生,但在iOS 11上工作正常



这是我使用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的收集视图之间的变化(预摘要除外)。

发生的事情是设置currentIndexPath = []没有为其itemsection分配任何值;它正在创建"空" indexpath(Indexpath对象基本上是任意长度的元组或值数组,并且可以创建/操纵)。任何试图以这种方式使用它的代码(例如将其传递给cellForItem调用)可能具有不确定的行为。看起来有效地将丢失的section值解释为-1,然后其他东西将-1解释为一个无签名的64位整数。

相反,如果您想使用现在拥有的相同一般逻辑,我建议将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的答案所暗示的那样,您可能需要重新考虑整体设计,以更好地适合iOS应用的较大设计模式。

我建议您稍微更改您的方法。让您的收集查看单元子类负责自行更新,也许是通过通知来更新。鉴于其重复使用的趋势,试图保留索引路径或对单元的引用总是有问题的。

相关内容

  • 没有找到相关文章