使用自定义按钮从Core Data UITableView中删除一行

时间:2012-06-14 06:23:08

标签: ios core-data nsfetchedresultscontroller

我有一个UITableView,核心数据和NSFetchedResultsController填充了单元格。我的自定义单元格上有一个自定义按钮,我打算用它来删除单元格。添加标准滑动到删除非常容易,但我宁愿使用此自定义按钮。有谁知道如何将一个动作连接到按钮,该按钮将从数据模型中删除条目并从UITableView删除单元格?对于我的生活,我找不到一个好的解决方案。

编辑:

这是我必须使用标准滑动删除来删除它的代码。我可以用任何方式修改它以使用按钮吗?

if (editingStyle == UITableViewCellEditingStyleDelete) {

    [self.tableView beginUpdates];

    // Delete the task 
    Task *taskToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSLog(@"Deleting (%@)", taskToDelete.name);
    [self.managedObjectContext deleteObject:taskToDelete];
    [self.managedObjectContext save:nil];

    // Delete the row 
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    [self performFetch];

    [self.tableView endUpdates];
}

1 个答案:

答案 0 :(得分:7)

概述:

  1. 将按钮连接到控制器上的操作deleteRow:(id)sender;
  2. sender将是按钮。获取其superview,然后是superview的superview,依此类推,直到你有了对UITableViewCell的引用。 (使用isKindOfClass:循环搜索,不要认为按钮只有1,2,3级。)
  3. 调用表视图的indexPathForCell:方法,将单元格引用转换为索引路径。
  4. 在获取的结果控制器上使用objectAtIndexPath:来获取对象。
  5. 然后删除它!如果您正在处理NSFetchedResultsController委托方法,他们将负责删除已删除的行。

    示例代码(在没有编译器的情况下输入以进行检查):

    - (void)deleteRow:(id)sender
    {
        id view = [sender superview];
        while (view && ![view isKindOfClass:[UITableViewCell class]]) {
            view = [view superview];
        }
        UITableViewCell *cell = view;
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
        NSManagedObject *task = [fetchedResultsController objectAtIndexPath:indexPath];
        [self.managedObjectContext deleteObject:task];
        [self.managedObjectContext save:nil];
    }
    

    就是这样。请勿尝试从表格视图中删除该行。当删除对象时,NSFetchedResultsController将检测更改并更新表视图,假设您按照NSFetchedResultsController文档中的描述设置委托方法。如果还没有,请阅读文档(只需双击Xcode中的“NSFetchedResultsController”)。