我的应用程序的一些用户正在使用我的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;
}
}
}
任何人都可以帮助我吗?
答案 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
,而我的项目数据已经为空。
这意味着事件连续两次被触发,或者操作系统第二次调用它以响应用户在删除最后一项后的某些操作。我还没有找到哪个,但我还没有看到它再次发生。但是,它解释了我见过的一些崩溃报告。