我有一个带有搜索栏/显示控制器的桌面视图(全部内置在故事板中)。 我的问题是删除行。删除行的功能有效但是行删除的动画似乎不稳定。有时删除是动画的,并且大多数情况下立即删除行而没有动画。
这是我的删除方法:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
if (tableView == self.searchDisplayController.searchResultsTableView) {
[_managedObjectContext deleteObject:[_notesFilteredFetcher objectAtIndexPath:indexPath]];
} else {
[_managedObjectContext deleteObject:[_notesFetcher objectAtIndexPath:indexPath]];
}
NSError *error;
if (![_managedObjectContext save:&error]) {
DLog(@"Failed deleting note : %@", [error localizedDescription]);
}
}
}
表视图正在使用核心数据,因此删除行会在适当的控制器方法中出现,如下所示:
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = (controller == _notesFilteredFetcher) ? self.searchDisplayController.searchResultsTableView : self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath forTable:tableView];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray
arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray
arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
我还注意到,当删除动画确实发生时,已删除行上方的所有行都向下移动,删除行下的行向上移动,直到覆盖空白空间。
如果我查看内置的邮件应用并删除一些行(即邮件),它似乎每次都会按预期进行动画处理,并且只有已删除行下方的行才会向上移动以覆盖空白区域(已删除行上方的行不移动)。
有什么想法吗?
更新
我注意到动画确实只发生在最后一行。如果我删除任何其他行没有动画,但如果我删除最后一行动画确实有效。
答案 0 :(得分:1)
如果有人遇到同样的问题:
我注意到在调用相同表视图的reloadData
之后,我立即调用了表视图的endUpdates
方法,以更新单元格的内部索引。
这将导致动画立即停止。删除reloadData
方法解决了动画问题。