我在使用核心数据删除NSMutableSet
中的对象时遇到问题。我试图删除tableview第二部分中的“播放器”对象。我收到了错误;
无效更新:第1部分中的行数无效 更新(6)后必须包含在现有部分中的行 等于之前该部分中包含的行数 更新(6),加上或减去插入或删除的行数 该部分(0插入,1删除)和加号或减号的数量 移入或移出该部分的行(0移入,0移出
解决方案
看看我的代码。
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
if (indexPath.section==0) {
}else{
_player = [self.fetchedResultsController.fetchedObjects objectAtIndex: indexPath.row];
[self.managedObjectContext deleteObject:_player];
[self performFetch];
[self.managedObjectContext save:nil];
// here the solution to make it works...
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationFade];
}
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch(section){
case 0:
return 4;
case 1:
return [self.fetchedResultsController.fetchedObjects count];
}
return 0;
}
答案 0 :(得分:1)
通常,当您需要从表视图中删除或删除元素时,您需要执行两步操作:
您只执行了第一部分。要完成,您需要执行如下调用
[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];
您需要将deleteRowsAtIndexPaths:withRowAnimation:
包裹在beginUpdates
之间
和endUpdates
如果你为你的表执行多个动画,例如删除,修改等。这不是这种情况,但无论如何你都可以这样做。
当您使用核心数据时,您可以免费(必须编写一些代码)NSFetchedResultsController
及其委托NSFetchedResultsControllerDelegate
。因此,当您删除带有deleteObject
调用的元素时(步骤1),代理将自动响应该更改并执行步骤2.
请查看How to use NSFetchedResultsController以了解如何正确设置它。
上面代码的修复是使用
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationFade];
希望有所帮助。