使用核心数据和数组从 TableView 中插入和删除行

Posted

技术标签:

【中文标题】使用核心数据和数组从 TableView 中插入和删除行【英文标题】:Insert and Delete row from TableView using Core Data and Array 【发布时间】:2012-02-01 17:09:47 【问题描述】:

我有一个包含多个部分的 tableView。这些部分由“items”数组填充,该数组实际上将两个不同的获取请求组合到一个字典数组中。第一个提取请求提取“未收集”项目,第二个提取请求“收集”项目。

表格视图填充得很好,我可以很容易地添加/删除项目。我还可以为未收集的单元格选择附件,它将移至“已收集”部分。在对数据进行任何更改后,我正在使用 reloadData 执行所有这些操作,现在我正在尝试将其转换为动画插入/删除。我从“未收集”到“已收集”的过渡开始,这应该会导致从前一部分删除单元格并在后一部分插入。

我对事情的顺序有点困惑。据我了解,我应该:

    更新项目(它从收集 == NO 切换为 YES) 保存我的托管对象上下文 驱动表格的“items”数组现在自动更新 插入/删除行

我发现我收到了错误:

'NSInternalInconsistencyException', reason: 'Invalid table view update.  The application has requested an update to the table view that is inconsistent with the state provided by the data source.

tableView 位于 TableViewController 中,它是 table view 的委托。我认为我已经正确地实现了 numberOfSections、numberOfRows 等。在这些中,我从我的“项目”数组中返回计数。

我的代码如下。

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
   
    Item *item = [self itemForIndexPath:indexPath];

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    UIButton *button = (UIButton *)cell.accessoryView;  

    if (![item collected]) 
        //update item
        [item setCollected:YES];
        [item setDateCollected:[NSDate date]];

        NSError *error = nil;
        if (![item.managedObjectContext save:&error]) 
            NSLog(@"Error saving collected/uncollected items");
        

        //update cell
        [button setBackgroundImage:[UIImage imageNamed:@"checked.png"] forState:UIControlStateNormal];

        //update tableview
        [tableView beginUpdates];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:self.items.count]] withRowAnimation:UITableViewRowAnimationFade];

[tableView endUpdates];
    
    else if ([item collected])...do the opposite

【问题讨论】:

【参考方案1】:

替换

[NSIndexPath indexPathForRow:0 inSection:self.items.count]

[NSIndexPath indexPathForRow:self.items.count inSection:0]

?

【讨论】:

不,我正在尝试将项目插入最后一部分的顶行(始终是我收集的项目)

以上是关于使用核心数据和数组从 TableView 中插入和删除行的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSFetchedResultsController 核心数据重新排序 TableView 单元格 - Swift 3

NSFetchedresultscontroller 与 tableview 插入新部分崩溃

从单个数组数据和多个部分填充 tableView

将图像保存到核心数据中并将其提取到 tableview 单元格中

我的 TableViewCell 没有从核心数据中删除,当 tableview 重新出现时重新出现

核心数据:如何从警报中更新 TableView 字段?