ios – 如何在UICollectionView performBatchUpdates块中对移动,插入,删除和更新进行排序?

前端之家收集整理的这篇文章主要介绍了ios – 如何在UICollectionView performBatchUpdates块中对移动,插入,删除和更新进行排序?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的UICollectionView中,我使用一个简单的自定义对象数组来生成显示单元格.有时候数据会发生变化,我想一次性对变化进行动画处理.我选择通过跟踪第二个数组中的所有更改,区分两者,并在performBatchUpdates块内部生成一组移动,插入,删除和更新操作来实现此目的.我现在意识到在同一个块中完成所有这些操作非常棘手,因为你不得不担心索引操作的顺序.事实上,this issue的接受答案是错误的(但在评论中已经纠正).

文档似乎很缺乏,但它涵盖了一个案例:

Deletes are processed before inserts in batch operations. This means
the indexes for the deletions are processed relative to the indexes of
the collection view’s state before the batch operation,and the
indexes for the insertions are processed relative to the indexes of
the state after all the deletions in the batch operation.

但是,该文档没有讨论何时处理移动.如果我在同一个performBatchUpdates中调用moveItemAtIndexPath和deleteItemsAtIndexPaths,那么移动索引是否应该相对于删除前或删除后的订单? insertItemsAtIndexPaths怎么样?

最后,我遇到了在同一操作中调用reloadItemsAtIndexPaths和moveItemAtIndexPath的问题:

Fatal Exception: NSInternalInconsistencyException attempt to delete
and reload the same index path

有没有办法在同一个performBatchUpdates中执行我想要的所有操作?如果是,那么更新相对于其他更新的处理顺序是什么?如果没有,人们通常会做什么?在完成所有其他操作后重新加载数据?之前?如果所有的动画都发生在一个阶段,我更喜欢.

@R_301_323@

对于移动操作,from indexPath是预删除索引,to indexPath是删除后索引.仅应为尚未插入,删除或移动的indexPath指定重新加载.这可能是您看到NSInternalInconsistencyException的原因.

验证操作的一种方便的方法是正确设置的:重新加载,插入和移动到索引路径的集合不应该有任何重复,并且重新加载,删除和移动索引路径的集合不应该有任何重复.

更新:

您移动的项目似乎也未更新,但仅移动.因此,如果需要更新和移动项目,可以在批量更新之前或之后执行重新加载(取决于数据源的状态).

猜你在找的iOS相关文章