You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift UITableView拖拽跨section移动行崩溃:目标index path不存在排查求助

核心根因

崩溃发生在系统调用moveRowAt之前的数据源一致性校验阶段,和你moveRowAt内的业务代码无关。
你允许跨分组的.move操作后,系统会先校验移动前后的数据源行数是否符合预期:比如从section0移动1行到section1,系统预期移动后section0行数-1,section1行数+1。但你修改任务到期日的逻辑写在moveRowAt里,系统做校验时还没执行这段代码,你的分组是实时计算的属性,此时overdueTasks和todayTasks的行数还没有变化,和系统预期的行数不符,直接触发崩溃。这也解释了你注释掉moveRowAt所有代码后崩溃依旧的现象。

解决方案

  • 方案1(快速修复,稳定性优先)
    放弃系统默认的move动画逻辑,修改dropSessionDidUpdate的返回值,所有跨分组拖拽统一返回.cancel操作,在dragSessionDidEnd回调里判断拖拽的源、目标indexPath是否合法,手动修改对应任务的到期日,最后调用reloadTableView()刷新即可,全程不走系统的move校验逻辑,完全规避崩溃。
  • 方案2(保留移动动画)
    在dropSessionDidUpdate返回.move提案之前,先提前修改拖拽任务的到期日,保证系统做预校验时,你的分组计算属性返回的行数已经符合移动后的预期,校验就能通过。
  • 方案3(长期优化)
    不要使用实时计算的属性作为分组数据源,将overdueTasks/todayTasks等改为存储属性,仅当zone.tasks发生变更时才重新计算赋值,避免拖拽过程中因时间自然变化、其他线程修改数据等意外情况导致行数突变。同时完全自定义Drag&Drop逻辑,在performDropWith回调里处理拖拽逻辑,手动调用deleteRows和insertRows执行动画,完全绕过系统默认的move校验逻辑。

内容的提问来源于stack exchange,提问作者CristianMoisei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:27:03