Ios 在tableview中删除节时应用程序崩溃
我正在尝试使用以下代码删除单元格并从UITableView中删除节:Ios 在tableview中删除节时应用程序崩溃,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我正在尝试使用以下代码删除单元格并从UITableView中删除节: [self.tableView beginUpdates]; [arraymasterFeedFullDetails removeObjectAtIndex:cellSelectedIndexPath.section]; [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:cellSelectedIndexPath.section]withRowAnimat
[self.tableView beginUpdates];
[arraymasterFeedFullDetails removeObjectAtIndex:cellSelectedIndexPath.section];
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:cellSelectedIndexPath.section]withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];
这里,cellSelectedIndexPath是NSIndexPath变量,它指向当前选定的节。arraymasterFeedFullDetails是我的数据源,每个部分只有一行
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return [arraymasterFeedFullDetails count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 1;
}
当您有一个数据源时(
arraymasterFeedFullDetails
,在您的例子中),删除一个项需要做的事情是从数据源中删除对象,然后重新加载表
您可以使用[self.tableView reloadData]重新加载表代码>
因此,您的代码如下所示:
[arraymasterFeedFullDetails removeObjectAtIndex:cellSelectedIndexPath.section];
[self.tableView reloadData];
当您有一个数据源(在您的例子中是arraymasterFeedFullDetails)时,删除一个项需要做的事情是从数据源中删除对象,然后重新加载整个表,或者通过动画从数据源中删除单元格。
这通常会产生更好的视觉效果
reloadData方法将重新加载整个表,而无需动画。
当前显示的单元格将被简单地重新绘制。例如:
[self.tableView reloadData];
您不需要更新tableview本身,因为它将被简单地重新绘制
要仅删除“编辑掉的单元格”,并产生动画效果,可以使用方法deleteRowsAtIndexPaths:withRowAnimation:
例如:
您还可以从可变数组中删除行,然后调用
deleteSections:withRowAnimation:
在开始更新和结束更新之间,以便从tableview中删除整个部分
在这两种动画删除方法中,在执行任何将更新tableview的动画之前,需要确保数据源具有相同的tableview单元格计数(删除后) 在NumberOfSectionsTableView中提供崩溃消息和堆栈跟踪的详细信息每次删除节时,您都必须从arraymasterFeedFullDetails中删除一个对象。我收到此崩溃消息:由于未捕获的异常而终止应用程序'NSInternalInconsistencyException',原因:'无效更新:节数无效。更新后表视图中包含的节数(6)必须等于更新前表视图中包含的节数(5),加上或减去插入或删除的节数(0插入,1删除)。'因此消息说您从5节开始,删除了一个,但在所有numberOfSectionsInTableView
的结尾处返回了6-比开始时多了一个。是否设置了断点并检查了数组?这样,它将重新加载整个tableview,而不是通过设置动画只删除所需的单元格。相反,您可以按照OPs方法更新数据源,这样就解决了问题。不,没有理由调用“reloadData”。只需删除一个部分。[tableView reloadData]加载完整的tableView,我想知道如何只加载一个部分。因为我在一个表中有大量的节。这也是无效的。OP希望删除整个节,而不是一行。使用deleteSections:withRowAnimation:
。
// Overridden to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
[_list2 removeObjectAtIndex:indexPath.row]; // remove row from array
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; // remove cell from UITableView
} else if (editingStyle == UITableViewCellEditingStyleInsert) {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
}
}