问:我正尝试将双关语更进一步,并删除行。我收到一个让我感到困惑的错误。显然,它不能正确地重新计算行数,但是我无法找到解决方法,因为双关语处理的部分与我通过google看到的内容完全不同。
错误是-无效的更新:第0节中的行数无效。更新(0)之后现有节中包含的行数必须等于更新(1)前该节中包含的行数,再加上或减去从该部分插入或删除的行数(插入0,删除2),再加上或减去移入或移出该部分的行数(移入0,移出0)。
我正在使用的删除代码是-
//删除行
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
如果(editingStyle == UITableViewCellEditingStyleDelete){
[self.tableView beginUpdates]; //避免NSInternalInconsistencyException
// //删除已刷卡的对象
Pun * punToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSLog(@“删除(%@)”,punToDelete.pun);
[self.managedObjectContext deleteObject:punToDelete];
[self.managedObjectContext save:nil];
//删除表格上的(现在为空)行
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
NSLog(@“%d”,self.fetchedResultsController.sections.count);
}
}
答:不需要专门调用delete,因为已经使用NSFetchedResultsControllerDelegatelikedidChangeSection和的方法调用了delete didChangeObject。
因此,您的代码实际上应该是:
-(void)tableView:(UITableView *)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath {
if(editingStyle == UITableViewCellEditingStyleDelete){
//删除对象
Pun * punToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath] ;
[self.managedObjectContext deleteObject:punToDelete];
[self.managedObjectContext save:nil];
}
}
理想情况下,您要检查错误:
如果(editingStyle == UITableViewCellEditingStyleDelete){双关
* punToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
[self.managedObjectContext deleteObject:punToDelete];
//保存上下文。
NSError *错误;
if(![self.managedObjectContext save:& error]){
/ *
用代码替换此实现以适当地处理错误。
abort()使应用程序生成崩溃日志并终止。尽管此功能在开发过程中可能很有用,但您不应在运输应用程序中使用此功能。如果无法从错误中恢复,请显示警告面板,指示用户通过按“主页”按钮退出应用程序。
* /
NSLog(@“未解决的错误%@,%@”,错误,[错误userInfo]);
abort();
}
}