UITableView - 核心数据应用程序中的表视图崩溃,因为删除后行数无效

Posted

技术标签:

【中文标题】UITableView - 核心数据应用程序中的表视图崩溃,因为删除后行数无效【英文标题】:UITableView - Table view in core data app crashing because number of rows not valid after deletion 【发布时间】:2013-06-30 04:30:56 【问题描述】:

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

由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'无效更新:无效 第 0 节中的行数。包含在第 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;    

【问题讨论】:

【参考方案1】:

这与 Core Data 无关。

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

如果你需要删除一行,你需要从数据源中删除该行,从表中删除它,但是->你需要在这两行代码之间做:

[_tableView beginUpdates];

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

[_tableView endUpdates];

【讨论】:

_tableView和self.tableView一样吗? _tableView 是变量,self.tableView 是属性(可能指的是变量),所以是的,大多数时候它是一样的...... 啊。也许是 [self.tableView beginUpdates],带有 s? 是的,抱歉,我没有完全检查方法名称 :) 我会修复它。谢谢。 所以你是说我会将内容包装在我的 commitEditingStyle: 上?尝试一下,我得到了完全相同的崩溃.. 不过谢谢!【参考方案2】:

我认为,问题在于我不需要手动删除该行:

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

我认为 FetchResultsController 可以解决这个问题。无论如何,我删除了该行并且它可以工作。

【讨论】:

以上是关于UITableView - 核心数据应用程序中的表视图崩溃,因为删除后行数无效的主要内容,如果未能解决你的问题,请参考以下文章

使用核心数据中的数组填充表视图

自定义 UITableView 单元格中的 UILabel 未随核心数据更改而更新

UITableView 加载核心数据的问题

核心数据支持的 UITableView 中的非核心数据数据

删除子视图中的核心数据后更新表视图

UItableview 不刷新核心数据中的更新数据