Ios 如何在拆分视图控制器中删除tableview行
我正在尝试删除显示在分割视图控制器中的tableview行。当我向左滑动并单击“删除”时,我的应用程序崩溃,我得到错误信息: 由于未捕获异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:节0中的行数无效。”。更新(44)后现有节中包含的行数必须等于更新(44)前该节中包含的行数,加上或减去从该节中插入或删除的行数(0插入,1删除),加上或减去移入或移出该节的行数(0迁入,0迁出)。' 我成功地使“重新排列”选项在表视图中正常工作,没有任何错误。对于“删除行”函数,我执行了以下操作:Ios 如何在拆分视图控制器中删除tableview行,ios,uitableview,nsmutablearray,nsindexpath,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。我想我试过了,但没有运气
我知道在我的项目中仅使用一种方法很难确定如何进行。您可以在此处查看我的整个项目:
非常感谢您的帮助
编辑----
这是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提供的信息,我更改了提交方式
- (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:'
如果我要求太多,很抱歉,但您能告诉我这一点吗。每当您更改表视图模型时,添加
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];
}
从beginUpdate
方法的文档中:
开始一系列插入、删除或选择行和行的方法调用
接收器的部分。如果需要后续操作,请调用此方法
插入、删除和选择操作(例如,
要设置动画的cellForRowAtIndexPath:和IndExpathForVisibleRows)
同时,这组方法必须以调用结束
这些方法对可以嵌套。如果您不
此块、表中的插入、删除和选择调用
行计数等属性可能无效。不应调用
在组内重新加载数据;如果在组内调用此方法,
您需要自己执行任何动画
如果只调用一次来删除、插入或重新加载行,则不必使用
begin/endUpdates
。@rmaddy我并不是说在所有情况下都需要使用它,但根据我的经验,它可能会修复同时发生多个更新表视图的调用时出现的一些奇怪行为。但这里不是这样。这是一个简单的滑动操作o-delete,只需调用一次deleteRows
。数据源似乎正在根据需要进行适当更新。不需要使用begin/endUpdates
。现在说了所有这些,似乎iOS 8有一大堆表视图错误。我遇到了几个。您的回答确实解决了iOS 8的错误,但它确实很有用没必要。我尝试添加了你的建议,但仍然得到了相同的错误。@rmaddy是的,我也必须处理iOS 8上的UITableView
错误,这个解决方法对我很有帮助。如果这些方法解决了问题,调用这些方法也没什么坏处,对吧?你测试的是iOS的哪个版本?我在实际设备上测试了我的7.0,在simul上测试了7.1注意:我在xcode6 beta 2中创建了这个应用程序。但是它的目标是ios 7.0。ios 8中有缺陷,但是在ios 7下它应该可以工作。两件事:1)在调用committedingstyle
时检查\u objects
是否为nil
。2) 在从\u objects
中删除对象后,确认您的numberOfRowsInSection
返回了正确的新行数。我在committeditingStyle方法中的deleteRowsAtIndexPaths行中添加了一个断点,在底部的调试窗口中,该断点表示“u objects为零”。我对这个比较陌生,不确定下一步该怎么做。那就是问题所在。由于\u对象
为nil
,因此不更新数据模型以反映已删除的行。在问题的部分张贴您的numberofrowsin方法。它使用什么来返回行数?是对象
还是其他什么?