我正在尝试删除分割视图控制器中显示的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:'
对不起,如果我要求很多,但是请你指导我。
答案 0 :(得分:1)
每当您更改表格视图模型时,最好添加beginUpdates
和endUpdates
方法调用:
- (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。这些方法对可以嵌套。如果你不做 此块,表中的插入,删除和选择调用 行计数等属性可能无效。你不应该打电话 在组内重新加载数据;如果你在组内调用此方法, 你需要自己动手制作任何动画。