我学习了如何使用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
现在我需要删除选定的单元格。我发现了一些代码,我准备删除骨架。但我需要两件事的建议。
我不知道如何获取删除项目的ID以及如何编写过滤器代码 - 即。 comment: //过滤已标记为从tableView中删除单元格的对象的代码
我不知道如何从tableView中删除单元格。我找到了解决方案,但是它有一个错误:
因未捕获的异常终止应用程序' NSInternalInconsistencyException',原因:'无效更新:第0部分中的行数无效。更新后现有部分中包含的行数(10)必须等于更新前的该部分中包含的行数(10),加上或减去从该部分插入或删除的行数(0插入,1删除)和加或减移入的行数或超出该部分(0移入,0移出)。'
以下是带注释的代码。
-(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];
}
答案 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];
}
}