检测何时重新排序UITableView

时间:2010-04-27 11:43:04

标签: iphone uitableview

我有一个由NSFetchedResultsController支持的UITableView,它可以随时触发更新。如果用户当前正在重新排序行,则应用这些更新将导致异常,因为表视图已暂时接管并且您收到类似

的错误
Invalid update: invalid number of rows in section [...]

如何检测用户何时开始移动单元格,以便延迟由获取的结果控制器引起的更新?似乎没有任何表视图委托方法来检测它。这个委托方法:

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath {

当用户最初分离第一个单元格时,不会被调用,只有当它们实际将它移动到其他位置时才会被调用。

一个解决方案是在提取的结果回调中检查isEditing,然后执行批量reloadData而不是动态插入/删除行,但我想知道是否有办法专门检查'重新排序'模式。

2 个答案:

答案 0 :(得分:1)

你错了,tableView:canMoveRowAtIndexPath没有解决问题。

在要更新或删除的所有单元格上使用[cell setEditing:NO]。

如果用户正在拖动单元格,则会取消拖动模式。

如果您需要[cell setEditing:YES],您可以在完成更新后立即恢复它。

答案 1 :(得分:0)

在表格移动一行之前,它会发送......

– tableView:canMoveRowAtIndexPath:

...到它的数据源。您可以在其中放置一个编辑锁定,该锁定将在单元格实际移动之前生效。

您可能想重新考虑一下您的设计。听起来你有一个数据模型可以同时由两个不同的源修改。如果是这样,那么您需要在数据模型本身中设置某种并发锁 ,这样两个修改实际上不会同时发生。同时修改不仅会导致UI出现问题,还会导致使用数据模型的任何问题。