我的应用目前使用常规UITableView
,通过NSFetchedResultsController
填充。我还使用NSFetchedResultsControllerDelegate
来更新表视图。行按部分分组,表示日期。这也由NSFetchedResultsController
处理。
除非在一个步骤中对部分进行大量更改,否则它的效果非常好。我在这里举个例子:
我的tableview看起来像这样:
[10/10/2016]
ROW 0.0
[10/08/2016]
ROW 1.0
ROW 1.1
现在我要更改项目ROW 0.0。我将日期从2016年10月10日更改为2016年9月10日。
//编辑//
准确地说:我的NSManagedObject
子类有一个属性NSDate* startingDate;
,它存储在数据库中。当用户点击保存按钮时,我会从NSDate
获取UIDatePicker
个对象,请确保它不是nil
并将属性设置为它。之后我保存了上下文。
//编辑//
发生的事情是NSFetchedResultsControllerDelegate
被叫三次。首先使用删除部分0,然后使用和插入部分0(尽管这两个在我执行几次时改变了顺序)。然后使用更新行0.0。
发生的事情是:没什么。 Tableview根本没有更新(部分标题保持不变),应该更改的行处于某种奇怪的状态,可以选择它(调用行选择的委托方法),但突出显示另一行。当我向下滚动时没有加载新行(我可以向下滚动,但它只显示空白区域)。
我的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;
case NSFetchedResultsChangeMove:
case NSFetchedResultsChangeUpdate:
break;
}
}
- (void) controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
switch(type) {
case NSFetchedResultsChangeInsert:
[[self tableView] insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
[[self tableView] deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[[self tableView] reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
break;
case NSFetchedResultsChangeMove:
[[self tableView] deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[[self tableView] insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
- (void) controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[[self tableView] endUpdates];
}
我尝试过另一个实现,它收集所有更改请求,优化它们并在- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
内执行所有更改请求,但结果相同。
对此的任何帮助将不胜感激。
非常感谢!