拖拽UICollectionViewCell时出现“Shadow insert is nil”崩溃,如何解决?
以下是几种可落地的规避方案:
严格保证数据源与UI同步
拖拽过程中,所有数据源的修改必须和UICollectionView的批量更新操作(performBatchUpdates:)绑定执行。尤其在collectionView:performDropWithCoordinator:回调里,务必在batch更新块内完成数组增删和UI更新,杜绝数据源和UI状态不一致的情况。限制触发拖拽的场景
在collectionView:itemsForBeginningSession:atIndexPath:回调中,对不允许拖拽的cell直接返回nil;或者在拖拽开始前检查当前数据源状态,若处于不稳定状态(比如正在加载、数据未完全初始化),直接返回nil阻止拖拽启动。暂停拖拽期间的布局修改
拖拽过程中系统依赖布局计算插入位置,此时动态调整布局(如修改item尺寸、增减section)会干扰shadow insert对象生成。建议在dragSessionWillBegin:回调中暂停布局的动态更新,待dragSessionDidEnd:后再恢复。增加拖拽/下落的合法性校验
在collectionView:canHandleDropSession:中校验session的有效性,若存在异常(如数据源为空、目标位置超出范围)返回NO;或在collectionView:dragSessionWillBegin:中判断当前状态,若有风险则调用session.end()终止拖拽。升级iOS系统版本
该崩溃属于UICollectionView内部的断言错误,大概率是特定iOS版本的系统bug(常见于iOS 13.x、14.x部分子版本),升级至最新iOS正式版可能已被苹果修复。
内容的提问来源于stack exchange,提问作者user3151675

