如何删除拆分视图控制器中的tableview行

时间:2014-08-04 16:01:42

标签: ios uitableview nsmutablearray nsindexpath

我正在尝试删除分割视图控制器中显示的tableview行。当我向左滑动并单击删除时,我的应用程序崩溃,我收到错误:

由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'无效更新:第0节中的无效行数。更新后现有部分中包含的行数(44)必须等于行数在更新(44)之前包含在该部分中,加上或减去从该部分插入或删除的行数(0插入,1删除)和加或减移入或移出该部分的行数(0移入,0搬出去。'

我确实设法让重新安排选项适用于表格视图而没有任何错误。对于删除行功能,我执行了以下操作:

- (void)tableView:(UITableView *)tableView commitEditingStyle:  (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [_objects removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
    withRowAnimation:UITableViewRowAnimationAutomatic];   
}

但必须有一些我不知道的东西。也许是一个简单的更新tableview。我想我试了但是没有运气。

我知道很难确定我的项目中只有一种方法。您可以在此处查看我的整个项目:

https://github.com/mithunan/presidents-splitView

感谢任何帮助。

EDIT ----

这是numberOfRowsInSection方法:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.presidents count];
}

这个方法也可能有帮助......

// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
    id object = [self.presidents objectAtIndex:fromIndexPath.row];
    [_objects removeObjectAtIndex:fromIndexPath.row];
    [_objects insertObject:object atIndex:toIndexPath.row];
}

谢谢

编辑2 -------------

根据rmaddy提供的信息,我更改了commitEditingStyle ...

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.presidents removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

}

但是现在我得到了一个构建错误:NSArray没有可见的@interface声明选择器'removeObjectAtIndex:'

对不起,如果我要求很多,但是请你指导我。

1 个答案:

答案 0 :(得分:1)

每当您更改表格视图模型时,最好添加beginUpdatesendUpdates方法调用:

- (void)tableView:(UITableView *)tableView commitEditingStyle:  (UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView beginUpdates];
    [_objects removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                     withRowAnimation:UITableViewRowAnimationAutomatic];
    [tableView endUpdates];
}

来自beginUpdates方法的文档:

  

开始一系列插入,删除或选择行的方法调用   接收器的各个部分。如果您想要后续,请调用此方法   插入,删除和选择操作(例如,   要动画的cellForRowAtIndexPath:和indexPathsForVisibleRows)   同时。这组方法必须以调用结束   of endUpdates。这些方法对可以嵌套。如果你不做   此块,表中的插入,删除和选择调用   行计数等属性可能无效。你不应该打电话   在组内重新加载数据;如果你在组内调用此方法,   你需要自己动手制作任何动画。