NSFetchedResultsControllerDelegate和deleteRowsAtIndexPaths:部分问题

时间:2011-04-04 13:06:56

标签: objective-c ios

响应对连接到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];
    }
}

1 个答案:

答案 0 :(得分:0)

我发现问题出在哪里。 委托在从UITabBar调用的控制器中定义。每次出现其视图时,都会调用一个函数来获取NSFEtchedResultController上的数据(带有performFetch)并设置NSFetchedResultControllerDelegate的委托。这种方式(我不确切知道为什么)每次我尝试删除或插入表格上的单元格/节时,委托似乎是重复多次,因为我通过UITabBar打开控制器,因此委托函数重复多次时间创造我在问题中描述的问题和错误。

为了避免这个问题,现在我在ViewController的init函数中设置Request和Delegate,而不是其他任何地方。这确保它只设置一个对委托的引用,并且只通过NSFetchResultController执行一次Fetch。