删除表视图中的行时出现ios 7不稳定动画问题

时间:2014-01-07 19:53:35

标签: uitableview ios7 uisearchbar

我有一个带有搜索栏/显示控制器的桌面视图(全部内置在故事板中)。 我的问题是删除行。删除行的功能有效但是行删除的动画似乎不稳定。有时删除是动画的,并且大多数情况下立即删除行而没有动画。

这是我的删除方法:

- (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;
    }
}

我还注意到,当删除动画确实发生时,已删除行上方的所有行都向下移动,删除行下的行向上移动,直到覆盖空白空间。

如果我查看内置的邮件应用并删除一些行(即邮件),它似乎每次都会按预期进行动画处理,并且只有已删除行下方的行才会向上移动以覆盖空白区域(已删除行上方的行不移动)。

有什么想法吗?

更新

我注意到动画确实只发生在最后一行。如果我删除任何其他行没有动画,但如果我删除最后一行动画确实有效。

1 个答案:

答案 0 :(得分:1)

如果有人遇到同样的问题:

我注意到在调用相同表视图的reloadData之后,我立即调用了表视图的endUpdates方法,以更新单元格的内部索引。

这将导致动画立即停止。删除reloadData方法解决了动画问题。