响应对连接到NSFetchedResultsController的tableView的CELL(不是部分)的删除操作,我得到了这个错误:
'无效更新:无效的号码 部分。部分的数量 包含在表格视图之后 update(1)必须等于数字 表中包含的部分 更新前的视图(2),加或 减去插入的部分数量 或删除(0插入,0删除)。'
我知道问题与更新前后的节号有关。它说我没有删除部分,但是后值与之前的值不同。
好的,这是真的!但我的部分依赖于行单元格,所以如果我删除一个部分的最后一行单元格,该部分就会消失。
这里我如何定义分段和行号: 创建节以按行“日期”对行进行分组。因此,如果一行具有属性“日期”2010年4月10日,第二行具有2010年4月11日,则我有2个部分包含1行。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [[self.controller sections]count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
这里是我对commitEditingStyle的定义,其中我从表中删除单元格并从DB中删除数据(对象类型“Transactions”是NSManagedObjectContext的子类,用于定义我的模型)。
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
Transactions *trans = (Transactions *)[self.controller objectAtIndexPath:indexPath];
//Delete transaction
[self.context deleteObject:trans];
NSError *error = nil;
[self.context save:&error];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];
}
}
答案 0 :(得分:0)
我发现问题出在哪里。 委托在从UITabBar调用的控制器中定义。每次出现其视图时,都会调用一个函数来获取NSFEtchedResultController上的数据(带有performFetch)并设置NSFetchedResultControllerDelegate的委托。这种方式(我不确切知道为什么)每次我尝试删除或插入表格上的单元格/节时,委托似乎是重复多次,因为我通过UITabBar打开控制器,因此委托函数重复多次时间创造我在问题中描述的问题和错误。
为了避免这个问题,现在我在ViewController的init函数中设置Request和Delegate,而不是其他任何地方。这确保它只设置一个对委托的引用,并且只通过NSFetchResultController执行一次Fetch。