deleteRowsAtIndexPaths:withRowAnimation:不工作

时间:2014-04-03 16:46:34

标签: ios uitableview

我试图很好地删除mu UITableView的单元格:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {

        [self deleteModelForIndexPath:indexPath];

        [mainTableView beginUpdates];
        [mainTableView deleteRowsAtIndexPaths:indexPath withRowAnimation:UITableViewRowAnimationTop];
        [mainTableView endUpdates];

    }
}

这会引发以下异常:

 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of sections.  The number of sections contained in the table view after the update (2) must be equal to the number of sections contained in the table view before the update (3), plus or minus the number of sections inserted or deleted (0 inserted, 0 deleted).'

我没有得到(0 inserted, 0 deleted)部分。为什么它不起作用?

由于

3 个答案:

答案 0 :(得分:1)

您应该同时更新表格数据。如果要为每一行使用数组对象,请从数组中删除已删除的数组。

答案 1 :(得分:1)

错误意味着它的含义:

  

更新后的表视图中包含的节数(2)必须等于更新前的表视图中包含的节数(3),加上或减去插入或删除的节数(0)插入,0删除)。'

这可能是更好的错误消息之一,它基本上意味着支持您的表视图的数据量与UI中的状态不一致,特别是部分的数量(提示:检查) –numberOfSectionsInTableView:)删除之前/之后。如果从表中删除行/部分,则需要确保从支持表的数据中删除该行/部分。

  

(0已插入,0已删除)

表示API未发现您的数据源有任何已删除的部分。

你绝对肯定你正在做你认为它正在做的事情:

[self deleteModelForIndexPath:indexPath];

答案 2 :(得分:0)

您不应该使用beginUpdatesendUpdates方法进行此类操作。你应该这样做:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete)
{
        [self deleteModelForIndexPath:indexPath];

        [mainTableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
    }
}

另外,您可以查看有关beginUpdates的文档:

  

如果您想要后续插入,删除和,请调用此方法   选择操作(例如,cellForRowAtIndexPath:和   indexPathsForVisibleRows)同时动画。这一组   方法必须以调用endUpdates结束。这些方法   对可以嵌套。如果您不进行插入,删除和   选择调用此块内部,表属性如行计数   可能会变得无效。你不应该在小组内呼叫reloadData;   如果您在组内调用此方法,则需要执行任何操作   自己制作动画。