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

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

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

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

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

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

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

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

解决方法

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

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

更新:

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

猜你在找的iOS相关文章