崩溃:commitEditingStyle -deleteObject为零

时间:2014-04-03 10:39:46

标签: ios objective-c core-data tableview nsfetchedresultscontroller

我的应用程序的一些用户正在使用我的TableView崩溃,后者使用NSFetchedResultsController从Core Data获取数据源。 My View控制器是CoreDataTableViewController的子类,它包含UITableViewController中NSFetchedResultsController的标准代码。 崩溃报告说由于这个原因,崩溃发生在tableView:commitEditingStyle:forRowAtIndexPath:]行(代码就在下面):

  

致命异常:NSInvalidArgumentException   -deleteObject:需要非零参数

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        [self.managedObjectContext deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

    }
}

我试图寻找类似的问题,但我找不到任何东西,并且它总是不会发生(从未在测试过程中经历过)。

这是我的CoreDataTableViewController类中的didChangeObject:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
    if (!self.suspendAutomaticTrackingOfChangesInManagedObjectContext)
    {
        switch(type)
        {
            case NSFetchedResultsChangeInsert:
                [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
                break;

            case NSFetchedResultsChangeDelete:
                [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
                break;

            case NSFetchedResultsChangeUpdate:
                [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
                break;

            case NSFetchedResultsChangeMove:
                [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
                [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
                break;
        }
    }
}

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

这里有一些你不会看到记录的东西,但它有时是正确的:这条信息在极少数情况下会被触发两次。如果是,则第二次indexPath将为nil

处理此问题的适当方法是首先检查nil

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {

        if (indexPath == nil) return;

        [self.managedObjectContext deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

    }
}

我的删除例程中有类似的崩溃已经持续了好几个月(可能是几年?)并且永远无法解决这个问题。直到有一天,我很幸运,当我删除附带调试器的行时,它发生了。我能够看到indexPath意外nil,而我的项目数据已经为空。

这意味着事件连续两次被触发,或者操作系统第二次调用它以响应用户删除最后一项后的某些操作。我还没有找到哪个,但我还没有看到它再次发生。但是,它解释了我见过的一些崩溃报告。