如何在 UICollectionView PerformBatchUpdates 块中排序移动、插入、删除和更新?

2024-06-26

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

  1. 删除→始终使用原始索引(将按降序使用)
  2. 插入→始终使用最终索引(将按升序使用)
  3. 移动 → From = 原始索引; To = 最终索引
  4. 重新加载 → 在底层,它会删除然后插入。索引=原始索引。您无法重新加载已移动的项目。

要重新加载已移动的项目,请在单独的PerformBatchUpdates,里面一个PerformWithoutAnimation(因为重新加载永远不会动画)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 UICollectionView PerformBatchUpdates 块中排序移动、插入、删除和更新? 的相关文章

随机推荐

  • 即使在不活动状态下,Hangfire 也会继续运行 SQL 查询

    我正在开发一个 ASP net MVC 5 网站 并使用 Hangfire 来安排一些任务 在本例中每 3 分钟一次 我知道一个事实是 运行这样的任务 以及与之相关的数据库查询 只需要几秒钟 我面临的问题是 Hangfire 似乎让我的 S
  • Zend Framework 中数据库驱动路由的教程?

    我正在开发一个需要使用数据库驱动的 MVC 方案的项目 其中控制器和视图的路由通过单个数据库表进行控制 但是 我无法找到任何使用当前版本的框架演示这一点的教程 它们似乎都是在几个版本之前编写的 我想知道是否有人用更新的版本做过类似的事情框架
  • 什么是 data.frame 可以做而 data.table 不能做的事情?

    我刚刚开始使用 R 并遇到了 data table 我发现它很棒 一个非常天真的问题 我可以忽略 data frame 来使用 data table 以避免两个包之间的语法混淆吗 来自数据表常见问题解答 http datatable r f
  • 使用 axios get 请求发送对象[重复]

    这个问题在这里已经有答案了 我想发送一个带有对象的获取请求 对象数据将在服务器上用于更新会话数据 但该对象似乎没有正确发送 因为如果我尝试将其发送回去打印出来 我只会得到 N 我可以像这样使用 jQuery 来完成它 它可以工作 get m
  • 对指针列表进行排序

    我再次发现自己在 C 中的一些非常简单的任务上失败了 有时我希望我能从 Java 中的 OO 中学到所有知识 因为我的问题通常是从像 Java 一样思考开始的 无论如何 我有一个std list
  • “双免”是什么意思?

    正如标题所暗示的那样 我是 C 语言的新手 并且很快就会有期中考试 我目前正在修改过去的论文 一个反复出现的主题是双重自由问题 我理解就是调用的过程free 在同一个内存位置两次 但我有几个问题我不能 100 确定如何回答 问题1 C中双重
  • Powershell从网站ie.document下载文件方法

    我创建了一个小脚本 使用 Internet explore 11 登录到 https 网站 我手动单击鼠标将文件下载到 IE 但我收到保存打开文件的提示 我希望能够绕过此问题 因为我要在后台运行这个吗 我是否在 ie navigate ur
  • 我可以通过编程方式选择 Android 布局文件夹吗?

    我正在构建一个 Android 应用程序 它使用不同的布局文件夹 即 Large xlarge 等 根据屏幕尺寸调整大小 唯一的问题是 我想为用户提供一种在小屏幕布局和大屏幕布局之间切换的方法 以防他们拥有无法识别 xlarge 标签的前蜂
  • 为什么 python 的 __init__ 函数没有 return 语句,即使它是一个函数

    这可能是一个愚蠢的问题 但我很想知道答案 根据官方文件 init 不需要return语句 有什么特殊原因会这样吗 gt gt gt class Complex def init self realpart imagpart self r r
  • 查找缺失值

    我有一个表 有 2 个重要的列 DocEntry WebId 样本数据就像 DocEntry WebId 1 S001 2 S002 3 S003 4 S005 现在我们可以注意到 在 WebId 列中 S004 丢失了 我们如何通过查询找
  • 与正在运行的进程通信

    We have 基于Python的服务器 A 正在运行的命令行应用程序 在同一台 Linux 机器上 能够读取stdin 计算一些东西并将输出提供给stdout B 将输入从 A 发送到的最佳 最优雅 方式是什么 stdin B 的 并等待
  • Android Widget 实现

    嗨 如果这个问题很愚蠢 我提前道歉 我对 Android 编程相当陌生 而且学得很快 我刚刚创建了一个任务提醒应用程序 并且想将该应用程序转换 实现为一个可以在主屏幕上查看的小部件 有什么方法吗 这可能吗 Thanks 如果没有更多关于您的
  • 从文件夹中读取java文件

    我开发了一个应用程序 可以从用户选择的文件夹中读取文件 它显示每个文件中有多少行代码 我只想在文件选择器中显示 Java 文件 具有 java 扩展名的文件 下面是我的代码 public static void main String ar
  • 我应该在mean.js中添加模块依赖项(对于ng-sortable)

    我正在尝试将 ng sortable 添加到我的基于mean js 的应用程序中 https github com a5hik ng sortable https github com a5hik ng sortable 按照安装说明并将其
  • 在 Jetpack compose 中使用 ModalDrawer 从右向左打开导航抽屉

    我一直在尝试在 Jetpack compose 中实现导航抽屉 以下代码显示了一种简单的方法 Composable fun ModalDrawerSample val drawerState rememberDrawerState Draw
  • 我的递归条件是否正确计算二叉树高度?

    我想在你的帮助下知道我的代码是对还是错 因为遗憾的是我无法运行它来检查 没有编译错误 我想做的是找到二叉树的高度 当然 树不必是平衡的 二叉树中的每个节点可以有两个节点作为子节点 http en wikipedia org wiki Bin
  • 解雇ViewControllerAnimated:完成:在 iOS 8 上

    在 iOS dismissViewControllerAnimated completion 会导致presentedViewController being nil 在 iOS 8 中 presentedViewController仍然指
  • 如何在 PHP 中获取有用的错误消息?

    我经常尝试运行 PHP 脚本 但只是得到一个空白屏幕 无错误信息 只是一个空屏幕 原因可能是一个简单的语法错误 错误的括号 缺少分号 或者函数调用失败 或者完全是其他原因 很难找出哪里出了问题 我最终注释掉了代码 在各处输入 echo 语句
  • 致命Python错误:init_import_size:无法在Anaconda Prompt中导入站点模块

    当我启动 Anaconda Prompt 时 收到以下错误消息 致命 Python 错误 init import size 无法导入站点模块 Python运行时状态 已初始化回溯 最近一次调用最后一次 文件 C Users blue App
  • 如何在 UICollectionView PerformBatchUpdates 块中排序移动、插入、删除和更新?

    In my UICollectionView 我使用一个简单的自定义对象数组来生成和显示单元格 有时数据会发生变化 我想一次性为所有变化添加动画效果 我选择通过跟踪第二个数组中的所有更改 比较两个数组并在一个数组内生成一组移动 插入 删除和