删除表格视图中的部分时应用程序崩溃

Posted

技术标签:

【中文标题】删除表格视图中的部分时应用程序崩溃【英文标题】:App crashes when remove a section in tableview 【发布时间】:2015-12-02 09:40:14 【问题描述】:

我正在尝试使用以下代码删除一个单元格并从 UITableView 中删除一个部分:

[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;

【问题讨论】:

给出崩溃消息和堆栈跟踪的详细信息 在 numberOfSectionsInTableView 中,每次删除部分时,您都必须从 arraymasterFeedFullDetails 中删除一个对象。 ***.com/questions/4243834/… 我收到此崩溃消息:由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效更新:无效的节数。更新后表视图中包含的节数(6)必须等于更新前表视图中包含的节数(5),加上或减去插入或删除的节数(0插入,1已删除)。' 所以消息说您从 5 个部分开始,删除了一个,但在所有 numberOfSectionsInTableView 的末尾返回 6 - 比您开始的部分。您是否设置了断点并检查了您的数组? 【参考方案1】:

当您有一个数据源(在您的情况下为arraymasterFeedFullDetails)时,您需要做的是删除一个项目,即从数据源中删除对象,然后重新加载表。

您可以使用[self.tableView reloadData];重新加载表格

所以你的代码会是这样的:

[arraymasterFeedFullDetails removeObjectAtIndex:cellSelectedIndexPath.section];
[self.tableView reloadData];

【讨论】:

这样,它会重新加载整个表格视图,而不是通过动画删除只需要的单元格。相反,您可以遵循 OP 方法并更新数据源,这样就解决了问题。 不,没有理由调用“reloadData”。只需删除一个部分。 [tableView reloadData] 加载完整的tableview,我想知道如何只加载一个部分。因为我在一个表中有大量的部分。【参考方案2】:

当您有一个数据源(在您的情况下为 arraymasterFeedFullDetails)时,您需要做的是删除一个项目,即从数据源中删除对象,然后重新加载整个表,或者从数据源中删除单元格与动画。 这通常会产生视觉上更好的结果。

reloadData 方法将重新加载整个表格,没有动画。 当前显示的单元格将被简单地重绘。例如:

[self.tableView reloadData];

您不需要更新 tableview 本身,因为这将被简单地重绘。

为了删除刚刚“编辑掉的单元格”,具有动画效果,您可以使用方法 deleteRowsAtIndexPaths: 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
        
    

您还可以从 mutable 数组中删除行,然后调用 deleteSections:withRowAnimation:beginUpdatesendUpdates 之间,以便从 tableview 中删除整个部分;

在这两种动画删除方法中,在执行任何将更新 tableview 的动画之前,您需要确保数据源具有相同数量的 tableview 单元格(删除后)

【讨论】:

这也是无效的。 OP 想要删除整个部分,而不是一行。使用deleteSections:withRowAnimation:

以上是关于删除表格视图中的部分时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在目标c中删除表格视图中的多个部分?

如何删除tableView单元iOS

当单元格滚动回视图时表格崩溃

滚动表格视图时应用程序崩溃

快速在表格视图中插入新行时应用程序崩溃?

在 SwiftUI 中使用模态视图删除列表中的项目时崩溃