从 fetchedresultsController 中删除错误没有索引处的部分

Posted

技术标签:

【中文标题】从 fetchedresultsController 中删除错误没有索引处的部分【英文标题】:Deleting from fetchedresultsController error no section at index 【发布时间】:2013-07-24 20:21:36 【问题描述】:

我一直试图弄清楚这一点,但没有得到任何结果。我很想得到一些帮助。 我使用一个有 2 次提取的表。只能编辑表格最后一部分中的 1。当我删除一个项目时,应用程序崩溃说索引处没有部分。我已经阅读了一些对其他类似问题的回复,但仍然无法解决。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return [[fetchedResultsController sections] count]+1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    if (section < fetchedResultsController.sections.count) 
        return [[fetchedResultsController.sections objectAtIndex:section]     numberOfObjects];
    
    else 
        return fetchedResultsControllerCustomWOD.fetchedObjects.count;
    

对于 commitEditing 方法:

- (void)tableView:(UITableView *)tableView commitEditingStyle:    
(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

    NSManagedObjectContext *context = [self managedObjectContext];
    if (editingStyle == UITableViewCellEditingStyleDelete) 

        // Delete object from database
        [context deleteObject:[[fetchedResultsControllerCustomFR     objectAtIndexPath:indexPath] objectAtIndex:indexPath.row]];

        NSError *error = nil;
        if (![context save:&error]) 
            NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]);
            return;
        

        // Remove device from table view
        [[fetchedResultsControllerCustomFR objectAtIndexPath:indexPath]     removeObjectAtIndex:indexPath.row];
        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]     withRowAnimation:UITableViewRowAnimationFade];
    

【问题讨论】:

【参考方案1】:

如果我理解你所有的 fetch 控制器,你就是:

在此处从 CoreData 中删除对象一次:

 // Delete object from database
        [context deleteObject:[[fetchedResultsControllerCustomFR     objectAtIndexPath:indexPath] objectAtIndex:indexPath.row]];

然后保存上下文:

NSError *error = nil;
if (![context save:&error]) 
    NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]);
    return;

这反过来会提醒fetchedResultsControllerCustomFR 某个项目已被删除。

然后您再次尝试从fetchedResultsControllerCustomFR 中删除:

// Remove device from table view
        [[fetchedResultsControllerCustomFR objectAtIndexPath:indexPath]     removeObjectAtIndex:indexPath.row];

应该已经知道它已经消失了。鉴于您已经设置了 fetch 控制器代表。

编辑:

将删除调用包装在 -begin 和 -end 调用中:

[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];

【讨论】:

最后一个应该被注释掉......但即使我这样做了,我也会得到:*** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“索引 14 处没有部分” 感谢更新的回复,但它又崩溃了。这是控制台日志: *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-2380.17/UITableView.m:1070 另外,我启用了 objc_exception_throw,它的输出是:libobjc.A.dylib`objc_exception_throw : 0x2547e52: pushl %ebp 如果有帮助的话。

以上是关于从 fetchedresultsController 中删除错误没有索引处的部分的主要内容,如果未能解决你的问题,请参考以下文章

如何从其他面板从 JTextField 获取输入

从PRISM开始学WPFMVVMViewModel?

在 python 中,为啥从数组读取比从列表读取慢?

从图库中挑选或从相机捕获的高质量图像

从PRISM开始学WPFMVVMCommand?

从PRISM开始学WPFPrism?