In my UICollectionView
,我使用一个简单的自定义对象数组来生成和显示单元格。有时数据会发生变化,我想一次性为所有变化添加动画效果。我选择通过跟踪第二个数组中的所有更改、比较两个数组并在一个数组内生成一组移动、插入、删除和更新操作来实现此目的。performBatchUpdates
堵塞。我现在意识到在同一个块中执行所有这些操作非常棘手,因为您必须担心索引的操作顺序。事实上,公认的答案这个问题 https://stackoverflow.com/questions/13751255/uicollectionview-performbatchupdates-inserting-deleting-and-moving-at-the-same是错误的(但已在评论中更正)。
该文档似乎相当缺乏,但它涵盖了一种情况:
在批量操作中,删除是在插入之前处理的。这意味着
删除的索引是相对于以下索引进行处理的
批量操作之前集合视图的状态,以及
插入的索引是相对于以下索引进行处理的
批量操作中所有删除后的状态。
但是,该文档没有讨论何时处理移动。如果我打电话moveItemAtIndexPath
and deleteItemsAtIndexPaths
在相同的performBatchUpdates
,移动索引应该相对于删除前还是删除后的订单?怎么样insertItemsAtIndexPaths
?
最后,我在打电话时遇到问题reloadItemsAtIndexPaths
and moveItemAtIndexPath
在同一操作中:
致命异常:NSInternalInconsistencyException 尝试删除
并重新加载相同的索引路径
有没有办法在同一个中完成我想要的所有操作performBatchUpdates
?如果是这样,更新相对于其他更新的处理顺序是什么?如果没有,人们通常会做什么?完成所有其他操作后重新加载数据?前?我更希望所有动画都发生在一个阶段。
马克的回答 https://stackoverflow.com/a/38625897/404321是对的。我建议观看WWDC 2018 年第 225 场“UICollectionView 之旅” https://developer.apple.com/videos/play/wwdc2018/225/从苹果工程师那里得到完整的解释。
You can 跳至 33'36" 标记 https://developer.apple.com/videos/play/wwdc2018/225/?time=2016对于有趣的一点。
视频摘要
- 2 份清单:“原始项目”(任何更改之前)和“最终项目”(所有更改之后);
- 原始索引→原始项目中的索引
- 最终索引→最终项目中的索引
操作顺序在PerformBatchUpdates
- 删除→始终使用原始索引(将按降序使用)
- 插入→始终使用最终索引(将按升序使用)
- 移动 → From = 原始索引; To = 最终索引
- 重新加载 → 在底层,它会删除然后插入。索引=原始索引。您无法重新加载已移动的项目。
要重新加载已移动的项目,请在单独的PerformBatchUpdates
,里面一个PerformWithoutAnimation
(因为重新加载永远不会动画)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)