我有一个 UITableView,它被配置为允许在编辑模式下在部分之间移动行。该表使用 NSFetchedResultsController 支持
很难描述我看到的问题,但本质上是:
1)用户开始拖动一行
2)其他行在桌子周围拖动时移开
3)用户释放触摸,我通过适当更新 ManagedObject 来响应 moveRowAtIndexPath: 回调(下面的代码)
4)现在,由于某些原因,其他行动画回到用户开始拖动之前的位置。也就是说,所有人都会向上或向下移动一排,回到原来的位置,而不是停留在新的位置。
一段时间后,通常在 0.5 秒到 3 秒之间,NSFetchResultsController 决定让我更新移动的单元格。在这一点上,我最终调用了 [table beginUpdates] 和 [table endUpdates] 并且行移动到它们应该执行的位置。
现在,来自 NSFetchResultsController 的延迟回调是一个奇怪的问题,但这似乎很重要。重要的是 UITableView 不会将行留在新位置,并且需要开始/结束更新调用才能将行放在应有的位置。我是否应该在此回调中做其他事情:
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
NSLog(@"UI is moving row from [%d, %d] to [%d, %d]", fromIndexPath.section, fromIndexPath.row, toIndexPath.section, toIndexPath.row);
self.inManualReorder = YES;
// Here I update the underlying object, code is not relevant as this works.
...
// I've tried saving the context here and delaying it untill later on. It doesn't affect
// the behavior in question.
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
self.inManualReorder = NO;
NSLog(@"UI finished moving row");
}