ios - viewDidDisppear 导致错误后的 performBatchUpdates?

标签 ios uicollectionview ios9

我在打电话

performBatchUpdates({
            self.insertItemsAtIndexPaths(indexPathes)
            },
            completion: {
                _ in
        })

在 Controller 中不可见的 Collection View 上!已经有另一个 View Controller 推到它上面。

这会导致以下错误:

Invalid update: invalid number of items in section 0.  The number of items contained in an existing section after the update (12) must be equal to the number of items contained in that section before the update (12), plus or minus the number of items inserted or deleted from that section (12 inserted, 0 deleted) and plus or minus the number of items moved into or out of that section (0 moved in, 0 moved out).'

但这根本不是真的,因为如果我在 View 可见时调用 performBatchUpdates,它将完美运行。

到底发生了什么?

编辑: 请注意,如果我调用 reloadData 它在 View 不可见时工作正常。苹果对此怎么说?

我怎样才能捕捉到这个异常。所以我可以改用用户 reloadData 吗?

编辑: 在调用 performBachUpdates 之前,我打印了以下内容:

print("visibleCells().count :"  + String(self.visibleCells().count))
print("dataModel count:" + String(self.dataArray.count))

这是我得到的:

visibleCells().count :0
dataModel count:12

这意味着异常不是真的!!

最佳答案

正如@rmaddy 在评论中提到的,您的问题是您没有正确更新数据模型。
您为 indexPathes(包含 12 个索引)调用了 insertItemsAtIndexPaths,但是您的数据模型在批量更新后以 12 个索引开始并以 12 个索引结束。您只需要在向数据模型中插入内容时调用插入(例如,在调用类似于 dataModel.insert("whatever", atIndex: 0) 之后,您也可以调用 insertItemsAtIndexPaths 索引为 0)。
这里似乎不是这种情况,因为您最终得到相同数量的元素 (12)。在这种情况下,如果你想刷新 Collection View ,你需要调用 reloadData(或者如果数据没有改变,则不要调用任何东西)

reloadData 不会抛出此类异常,因为它不会添加/删除任何内容,它只会获取您在数据源中提供的任何内容。 insertItemsAtIndexPaths 可以为更改设置动画,因此它会进行一些检查以查看您的数据模型(无论您在数据源中提供什么)是否添加了新元素,否则会抛出异常。
捕获异常(使用 @try/catch)不会让你走得太远,因为它会使更新处于某种奇怪的状态,从而导致进一步的问题。

关于ios - viewDidDisppear 导致错误后的 performBatchUpdates?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37053548/

相关文章:

ios - 按特定键对字典数组进行排序

swift - String Swift 中的动画单个字符

ios - UICollectionView 不允许完全滚动---最后几行被切断

ios - 无互联网连接时的 URLSession 响应

ios9 - iOS9 的 UILocalNotification 问题

iphone - 如何检测 AVCaptureDevice 的闪光灯何时完成以及静止图像捕获何时开始?

ios - 无法将透明的应用程序图标设置为 iTunes Connect

ios - iPhone 中的 WatchConnectivity 连接 -> 观看方向

ios - UILabel:用连字符包裹和/或打破内部单词

ios - Swift - 无法动态更改 UICollectionViewFlowLayout