1

我正在创建一个核心数据示例,其中我想删除托管对象(此处称为项目)。删除管理对象似乎可行,但刷新 tableView 是个问题。以下是我在调用应用程序崩溃时收到的日志消息tableView: numberOfRowsInSection:

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效。更新后现有节中包含的行数 (13) 必须等于该节中包含的行数更新前的节 (13),加上或减去从该节插入或删除的行数(0 插入,1 删除),加上或减去移入或移出该节的行数(0 移入,0 移动出去)。'

这里删除前的行数为 14,删除后的行数为 13。请参阅我用于 A 的方法。获取行数,这应该等于核心数据中的“项目”数。B. 删除项目。C.设置tableView的行数。

一种。

-(void) setupFetchResultsController {
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Project"];
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    NSError *error;
    fetchedProjects = [managedObjectContext executeFetchRequest:request error:&error];
    if (fetchedProjects == nil) {
        // Handle the error.
    }
    self.fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:nil];
}

B.

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    selectedProject = [self.fetchedResultsController objectAtIndexPath:indexPath];
    [managedObjectContext deleteObject:selectedProject];
        //setting up the fetch results controlleris intended to get the number rows correctly by fetching the existant projects. In the above log, the result would be 14 (not 13) without this line.  Crashes with or without this line. 
    [self setupFetchResultsController];    
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}

C。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {   
    int noOfRows = [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
    return noOfRows;    
}
4

2 回答 2

2

这与核心数据无关。

您必须确保表中的行数和数据源中的行数始终相同。

如果您需要删除一行,则需要从数据源中删除该行,从表中删除它,但是->您需要在这两行代码之间执行此操作:

[_tableView beginUpdates];

// here delete from data source, and from the table.

[_tableView endUpdates];
于 2013-06-30T05:05:18.930 回答
1

我认为,问题是我不需要使用以下方法手动删除该行:

if (editingStyle == UITableViewCellEditingStyleDelete) {
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }

我认为 FetchResultsController 可以解决这个问题。无论如何,我删除了这条线并且它有效。

于 2013-06-30T05:34:07.873 回答