2

我正在尝试为我的应用程序实现自定义删除过程,因为我的客户不想要表格视图编辑模式提供的红色圆圈。我为每一行添加了一个删除按钮,其标签属性中有行号。一旦用户单击删除按钮,它就会触发以下方法:

-(IBAction)deleteRow:(id)sender{

    UIButton *tempButton = (UIButton*)sender;

   [self updateTotals];

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:tempButton.tag inSection:0];

    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]  withRowAnimation:UITableViewRowAnimationFade];

    [tableView reloadData];

    [sharedCompra removeItem:tempButton.tag];

    tempButton=nil;


}

我总是得到这个错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0.  The number of rows contained in an existing section after the update (3) must be equal to the number of rows contained in that section before the update (3), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

所以我不知道我是否在这段代码中遗漏了一些东西。

非常感谢。

4

3 回答 3

12

您正在尝试删除一行,而您的数据源仍反映原始状态(即删除之前的状态)。您必须先更新数据源然后才能从表 viev 中发出删除。您也不需要将按钮设置为nil,也不需要调用- reloadData表格视图:

- (void)deleteRow:(id)sender
{
    UIButton *tempButton = sender;
    [self updateTotals];

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:tempButton.tag inSection:0];
    [sharedCompra removeItem:tempButton.tag];

    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]  withRowAnimation:UITableViewRowAnimationFade];
}

(但是,您应该做的一件事是注意如何格式化代码。

于 2012-11-10T17:09:47.743 回答
1

打电话[sharedCompra removeItem:tempButton.tag];之前[tableView deleteRowsAtIndexPaths...[tableView reloadData]

问题是,当您调用deleteRowsAtIndexPath:它时,它会numberOfRowsInSection从您的模型返回相同的计数。

reloadData这里也不需要调用。

于 2012-11-10T17:07:33.753 回答
0

删除和添加行时,您需要调用 beginUpdates,这里应该是这样的。

[tableView beginUpdates];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]  withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];

而且你不需要调用reloadData,否则会取消deleteRows和insertRows方法的动画。但是你确实需要重置数据,所以如果你使用的是 NSMutableArray,你需要先删除对象,所以索引 0 处的项目,然后你可以删除表中的第 0 行。当它结束删除时,行数需要与该数组中的对象数相匹配,否则它也会崩溃。

于 2012-11-10T17:12:11.233 回答