ios - 崩溃 :commitEditingStyle -deleteObject is nil

标签 ios objective-c core-data tableview nsfetchedresultscontroller

我的应用程序的一些用户在使用我的 TableView 时遇到了崩溃,它使用了 NSFetchedResultsController从 Core Data 获取数据源。我的 View Controller 是 CoreDataTableViewController 的子类它在 UITableViewController 中包含 NSFetchedResultsController 的标准代码.
崩溃报告说崩溃发生在 tableView:commitEditingStyle:forRowAtIndexPath:]出于这个原因,在该行(代码就在下面):

Fatal Exception: NSInvalidArgumentException -deleteObject: requires a non-nil argument


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

    if (editingStyle == UITableViewCellEditingStyleDelete) {

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

    }
}

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

这是我的 CoreDataTableViewController 中的 didChangeObject类(class):
- (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;
        }
    }
}

谁能帮我?

最佳答案

以下是您不会看到记录的内容,但有时确实如此:在极少数情况下,此消息可能会被触发两次。如果是,第二次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 ,我的项目数组是 已经空的。

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

关于ios - 崩溃 :commitEditingStyle -deleteObject is nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22835063/

相关文章:

ios - Phonegap/Cordova 2.7.0 : exec_gap file not found

html - 如何在 Cordova iOS 项目中更改文本字段光标颜色

ios - CTRunDelegateRef iPhone 的内存管理

iphone - 羽化 NSView 不透明度

ios - 使用 Alamofire 进行简单的发布请求

objective-c - 在 Objective-C 中初始化静态变量

ios - 使用CoreBluetooth/CBCentralManager.h框架

ios - 如何迁移刚刚创建目标实体模型的 Coredata 中的实体

core-data - 将 mogenerator 集成到 Xcode 4 中

iOS RestKit人工识别属性