【发布时间】:2011-09-07 17:41:50
【问题描述】:
这是NSFetchedResultsControllerDelegate的文档中给出的模板代码:
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {
switch(type) {
case NSFetchedResultsChangeInsert:
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]
withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex]
withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = 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];
break;
case NSFetchedResultsChangeMove:
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}
使用此代码,默认分组样式的表格视图会使用背景视图更改动画很好地更新其单元格:当删除第一个单元格时,第二个单元格将成为第一个单元格,其顶角从方形变为圆形,等等。
但是,对于带有自定义backgroundView 的单元格,表格视图不会为我们做相同的背景视图转换。所以我们会看到这样的事情:
删除第一行之前
删除第一行后
如何通过适当的背景视图更新恢复漂亮的动画?
【问题讨论】:
-
您是否尝试在删除行后重新加载现在位于顶部的行(使用 [self.tableView reloadRowsAtIndexPaths: withRowAnimation:])?
-
在这种情况下我可以重新加载行。但是有很多不同的情况,我想要一种通用的方法来处理所有这些情况。现在我在
NSFetchedResultsControllerDelegate方法中使用了非常复杂的代码,我想知道是否有一个魔术触发器可用于将默认分组表视图的漂亮动画应用于自定义分组表视图,或者其他人是否更容易和更聪明的实现。 -
如果你使用图像作为背景视图,那么你必须让它看起来像你自己。
-
只在
controllerDidChangeContent:中调用[self.tableView reloadData]能正常工作吗?如果是这样,如果重新加载数据成本低,这可能是一个可行的解决方案。 -
@Danra 但我仍然想要漂亮的动画。
标签: ios uitableview nsfetchedresultscontroller