UITableView重排序时删除行的相关技术问题求助
嘿,结合我处理实时联动(比如Pusher这类服务)+ 表格拖拽排序的经验,给你逐个解决这三个问题:
问题1:需要删除时取消单元格重排序(清空排序状态)
核心是在收到删除指令的瞬间,终止当前的拖拽/排序会话,不同平台的实现略有区别:
- iOS(UITableView/UICollectionView):系统自带的拖拽排序可以直接通过拖拽会话来取消:
// 收到Pusher删除通知时执行 if let activeDragSession = tableView.dragSession { activeDragSession.cancel() // 立即终止拖拽 } // 若是自定义长按排序,可把排序状态标记置为false,同时取消长按手势 isReordering = false longPressGesture.isEnabled = false - 前端(比如用Sortable.js):可以临时禁用排序或者直接结束当前拖拽:
// 收到Pusher删除消息时 sortable.option('disabled', true); // 禁用排序,当前拖拽会自动终止 // 删除完成后若需恢复排序,再设为false // sortable.option('disabled', false);
问题2:避免已删除的单元格在完成重排序时触发任何操作
关键是在排序结束的回调里,先校验当前操作的单元格对应的数据源是否还存在(毕竟Pusher已经同步删除了数据):
- 前端示例:
sortable.on('end', function(evt) { const itemId = evt.item.dataset.itemId; // 假设单元格上存了数据ID // 检查这个ID是否还在本地数据源中 const isItemStillExists = yourDataSource.some(item => item.id === itemId); if (!isItemStillExists) { // 数据已被删除,直接跳过后续同步逻辑 return; } // 正常执行排序后的后端同步操作 syncNewOrderToServer(yourDataSource); }); - iOS示例:
func tableView(_ tableView: UITableView, performDropWith coordinator: UITableViewDropCoordinator) { guard let destinationIndexPath = coordinator.destinationIndexPath else { return } // 获取要移动的模型 guard let movedModel = coordinator.items.first?.dragItem.localObject as? YourModel else { return } // 检查模型是否还在数据源中(比如用ID匹配) let modelExists = yourDataSource.contains { $0.id == movedModel.id } if !modelExists { coordinator.cancel() // 取消当前drop操作 return } // 正常执行移动数据源、更新UI、同步后端的逻辑 updateDataSourceAndSync() }
问题3:在需要执行操作前判断表格是否正在进行单元格重排序
你可以通过组件内置的API或者自定义状态标记来实现:
- 利用组件内置API:
- iOS:UITableView自带
hasActiveDrag和hasActiveDrop属性,直接判断:if tableView.hasActiveDrag || tableView.hasActiveDrop { // 当前正在重排序 print("表格正在排序,先处理排序状态再执行操作") } else { // 直接执行删除或其他操作 } - 前端Sortable.js:可以直接访问
sortable.dragging属性,它会返回布尔值表示是否正在拖拽:if (sortable.dragging) { // 正在排序,先取消再执行删除 sortable.option('disabled', true); // 执行删除逻辑 deleteItem(itemId); // 恢复排序 setTimeout(() => sortable.option('disabled', false), 100); } else { deleteItem(itemId); }
- iOS:UITableView自带
- 自定义状态标记:如果是自己实现的排序逻辑,维护一个全局布尔变量
isTableReordering,开始排序时设为true,排序结束(包括取消)时设为false,执行操作前先检查这个变量即可。
总结一下,核心就是用状态追踪排序过程,删除时先终止排序,排序结束时校验数据有效性,这样就能避免冲突啦~
内容的提问来源于stack exchange,提问作者Miyagui
相关产品推荐
相关产品推荐

