我有一个由NSFetchedResultsController支持的UITableView,它可以随时触发更新。如果用户当前正在重新排序行,则应用这些更新将导致异常,因为表视图已暂时接管并且您收到类似
的错误Invalid update: invalid number of rows in section [...]
如何检测用户何时开始移动单元格,以便延迟由获取的结果控制器引起的更新?似乎没有任何表视图委托方法来检测它。这个委托方法:
- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath {
当用户最初分离第一个单元格时,不会被调用,只有当它们实际将它移动到其他位置时才会被调用。
一个解决方案是在提取的结果回调中检查isEditing
,然后执行批量reloadData
而不是动态插入/删除行,但我想知道是否有办法专门检查'重新排序'模式。
答案 0 :(得分:1)
你错了,tableView:canMoveRowAtIndexPath没有解决问题。
在要更新或删除的所有单元格上使用[cell setEditing:NO]。
如果用户正在拖动单元格,则会取消拖动模式。
如果您需要[cell setEditing:YES],您可以在完成更新后立即恢复它。
答案 1 :(得分:0)
在表格移动一行之前,它会发送......
– tableView:canMoveRowAtIndexPath:
...到它的数据源。您可以在其中放置一个编辑锁定,该锁定将在单元格实际移动之前生效。
您可能想重新考虑一下您的设计。听起来你有一个数据模型可以同时由两个不同的源修改。如果是这样,那么您需要在数据模型本身中设置某种并发锁 ,这样两个修改实际上不会同时发生。同时修改不仅会导致UI出现问题,还会导致使用数据模型的任何问题。