ios – 在viewDidDisppear导致错误后执行performUpdates?

我在打电话

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

在集合视图中,在控制器中看不到!已经有另一个视图控制器推到它上面.

这会导致以下错误:

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).'

但这根本不是真的,因为如果我在视图可见时调用performBatchUpdates,它将完美无缺.

究竟发生了什么?

编辑:
请注意,如果我调用reloadData,它在视图不可见时工作正常.苹果对此有何评论?

我怎么能抓住这个例外.所以我可以改为使用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个索引结束.您只需要在数据模型中插入内容时调用insert(例如,在调用类似于dataModel.insert(“whatever”,atIndex:0)之后,您也可以调用带索引0的insertItemsAtIndexPaths).

这似乎不是这种情况,因为你最终会得到相同数量的元素(12).在这种情况下,如果要刷新集合视图,则需要调用reloadData(如果数据没有更改,则不要调用任何内容)

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

点赞