1

我有一个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];
}
4

1 回答 1

7

总体概述:

  1. 将按钮连接到控制器上的操作,deleteRow:(id)sender
  2. sender是按钮。获取它的superview,然后是它的superview 的superview,依此类推,直到你有对UITableViewCell 的引用。(使用 循环搜索isKindOfClass:,不要假设按钮仅向下 1、2、3 级。)
  3. 调用表格视图的indexPathForCell:方法将单元格引用转换为索引路径。
  4. 在获取的结果控制器上使用objectAtIndexPath:以获取对象。

然后删除它!如果您正在处理 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”)。

于 2012-06-14T06:34:11.613 回答