从 UITableView 中删除单元格而不是从数组中

Posted

技术标签:

【中文标题】从 UITableView 中删除单元格而不是从数组中【英文标题】:Delete cell from UITableView not from Array 【发布时间】:2014-03-11 22:16:26 【问题描述】:

我学习了如何使用 CoreData 和表格视图控制器。学了一本书,有使用这个功能来显示TableViewController的内容。

-(UITableViewCell *)tableView:(UITableView *)tableView
        cellForRowAtIndexPath:(NSIndexPath *)indexPath
    if(debug == 1)
        NSLog(@"Running %@ '%@'",self.class, NSStringFromSelector(_cmd));
    

    static NSString *cellIndetifier = @"Class Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIndetifier
                                                            forIndexPath:indexPath];

    cell.accessoryType = UITableViewCellAccessoryDetailButton;
    SchoolClass *class = [self.frc objectAtIndexPath:indexPath];
    NSMutableString *title = [NSMutableString stringWithFormat:@"%@", class.name];

    [title replaceOccurrencesOfString:@"(null)"
                           withString:@""
                              options:0
                                range:NSMakeRange(0, [title length])];

    cell.textLabel.text = title;

    return cell;

现在我想从表视图控制器和 coreData 中删除一条记录(单元格)。我不知道什么是最简单的方法,但我发现了这个:

我有一个“删除”按钮,该按钮具有此 IBA 操作。

-(IBAction)deleteClassAction:(id)sender
    [self.tableView setEditing:YES animated:YES];

当我按下按钮时,我看到如下内容: http://i.stack.imgur.com/3VAyp.png

现在我需要删除选定的单元格。我找到了一些代码,并准备了要删除的骨架。但我需要两件事上的建议。

    我不知道如何获取删除项的 ID 以及如何为过滤器编写代码 - 即。 comment: // 过滤已标记为从 tableView 中删除单元格的对象的代码

    我不知道如何从 tableView 中删除单元格。我在评论下找到了解决方案,但它有一个错误:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:第 0 节中的行数无效。更新后现有节中包含的行数 (10) 必须等于更新前该节中包含的行数 (10),加上或减去从该节中插入或删除的行数(0 插入,1 删除) 加上或减去移入或移出该部分的行数(0 移入,0 移出)。'

这是带有 cmets 的代码。

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

    // deleting data from CoreData database

    CoreDataHelper *cdh = [(AppDelegate *) [[UIApplication sharedApplication] delegate] cdh];

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"];

    NSPredicate *filter = // the code that filters the object that has been marked for deleting cell from tableView"

    [request setPredicate:filter];

    NSArray *fetchedObjects = [cdh.context executeFetchRequest:request error:nil];

    for(SchoolClass *class in fetchedObjects)

        [_coreDataHelper.context deleteObject:class];
    

    // deleting cell from tableView

    if (editingStyle == UITableViewCellEditingStyleDelete) 

        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    


    [self.tableView reloadData];

【问题讨论】:

【参考方案1】:

您只需从您的NSFetchedResultsController 中删除该对象。然后您可能还想保存NSManagedObjectContext。假设您已经实现了docs 中描述的委托方法,那么获取的结果控制器将更新表格视图。

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

  // deleting cell from fetched results contoller

  if (editingStyle == UITableViewCellEditingStyleDelete) 

      SchoolClass *class = [self.frc objectAtIndexPath:indexPath];
      [[class managedObjectContext] deleteObject:class];
  

【讨论】:

哇!多么简单!效果很好!非常感谢老兄! 编辑:你打败了我! 是的!谢谢,我刚刚提交了我的评论,因为你接受了它。很高兴你让它工作:)

以上是关于从 UITableView 中删除单元格而不是从数组中的主要内容,如果未能解决你的问题,请参考以下文章

OpenOffice Calc合并单元格而不格式化?

在 Excel 中合并单元格而不丢失数据

如何在故事板中创建的 UITableView 中隐藏单元格?

有没有办法专注于 DataGrid 的单元格而不将其设置为可编辑?

删除表格单元格的问题

在 UITableView 中缓存图像