从 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 中删除单元格而不是从数组中的主要内容,如果未能解决你的问题,请参考以下文章
如何在故事板中创建的 UITableView 中隐藏单元格?