使用Core Data和Array从TableView插入和删除行

时间:2012-02-01 17:09:47

标签: ios uitableview core-data

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

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

我对事情的顺序感到有些困惑。据我所知,我应该:

  1. 更新项目(它从收集的== NO切换到YES)
  2. 保存我的托管对象上下文
  3. 驱动表格的'items'数组现已更新为automaticall
  4. 插入/删除行
  5. 我发现我收到错误:

    '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中,TableViewController是表视图的委托。我认为我已正确实现了numberOfSections,numberOfRows等。在这些中,我从'items'数组返回计数。

    我的代码如下。

    - (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 个答案:

答案 0 :(得分:0)

替换

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

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