iOS - NSInternalInconsistencyException 发生在 iOS 9 和 10 但在 iOS 11 上工作正常
iOS - NSInternalInconsistencyException happens on iOS 9 and 10 but working fine on iOS 11
这是我在 iOS 9 和 10 设备上遇到的错误:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for number of
items before section 9223372036854775807 when there are only 1
sections in the collection view'
这个错误对我来说似乎很清楚,但是我无法理解为什么在 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 到 iOS 11 的 collectionView 之间的变化行为(预取除外)。
发生的事情是设置 currentIndexPath = []
没有为其 item
或 section
分配任何值;它正在创建一个 "empty" IndexPath(IndexPath 对象基本上是任意长度的元组或值数组,并且可以是 created/manipulated)。任何试图以这种方式使用它的代码(例如将它传递给 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...
}
}
这遵循 Swift 习语,并明确了您从 "unknown" 索引路径开始的概念。
但是 - 作为 ,您可能需要重新考虑您的整体设计,以更好地适应 iOS 应用的更大设计模式。
我建议稍微改变一下您的方法。让您的集合视图单元格子类负责更新自身,也许来自通知。尝试保留索引路径或对单元格的引用总是会出现问题,因为它们往往会被重用。
这是我在 iOS 9 和 10 设备上遇到的错误:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for number of items before section 9223372036854775807 when there are only 1 sections in the collection view'
这个错误对我来说似乎很清楚,但是我无法理解为什么在 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 到 iOS 11 的 collectionView 之间的变化行为(预取除外)。
发生的事情是设置 currentIndexPath = []
没有为其 item
或 section
分配任何值;它正在创建一个 "empty" IndexPath(IndexPath 对象基本上是任意长度的元组或值数组,并且可以是 created/manipulated)。任何试图以这种方式使用它的代码(例如将它传递给 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...
}
}
这遵循 Swift 习语,并明确了您从 "unknown" 索引路径开始的概念。
但是 - 作为
我建议稍微改变一下您的方法。让您的集合视图单元格子类负责更新自身,也许来自通知。尝试保留索引路径或对单元格的引用总是会出现问题,因为它们往往会被重用。