NSFetchedResultsController删除和添加相同的部分导致奇怪的行为

时间:2016-10-11 15:26:52

标签: ios objective-c uitableview nsfetchedresultscontroller

我的应用目前使用常规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内执行所有更改请求,但结果相同。

对此的任何帮助将不胜感激。

非常感谢!

0 个答案:

没有答案