从UITableView中删除单元格而不是从Array中删除单元格

时间:2014-03-11 22:16:27

标签: objective-c core-data uitableview ios7

我学习了如何使用CoreData和Table视图控制器。我从一本书中学习并使用此函数来显示TableViewControoler的内容。

-(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

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

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

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

  3. 以下是带注释的代码。

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

答案 0 :(得分:0)

您只需要从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];
  }
}