1

我自己有一个 UITableView,它总共初始化了 8 个部分,大多数部分只有 1 行,但少数有 2 行。我正在批量删除表中的行。我意识到其中一些行是其部分中唯一的行,因此我没有删除这些行,而是尝试删除它们的部分。我试图从 8 个部分(总共 12 行)减少到剩余的 2 个部分(每个部分 1 行)。

在调用表删除行和部分之前,我确保所有行和部分都在我的数据源之外。我的二维数组正在正确更新,因此数组的新大小为 2,每个子数组仅包含 1。考虑到这一点,在执行实际删除之前,数据源中的所有内容都已正确更新。

非常简单的代码来进行删除

[self.tableView beginUpdates];
[self.tableView deleteRowsAtIndexPaths:indexPathsToRemove withRowAnimation:UITableViewRowAnimationFade];
[self.tableView deleteSections:sectionsToRemove withRowAnimation:UITableViewRowAnimationFade];
[self.tableView endUpdates];

[self.tableView endUpdates]但是,我在通话中遇到了崩溃。具体来说,崩溃是 *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit/UIKit-2380.17/UITableView.m:1070

编辑:这个崩溃是不正确的,我因为索引越界错误而崩溃,这将在下面描述

使用调试器单步执行- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section让我确信我的数据源是正确的,返回 2 个部分,每个部分有 1 行。然而,这是奇怪的部分。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section委托实现中,表格视图传递给我一个section=0,然后是一个section=1(这是预期的),它应该在那里结束。但它没有,然后它传递给我一个section = 6。

我不知道 6 是从哪里来的。我的数据源中的所有数字都是正确的。有人对我如何更好地调试有任何想法吗?或者关于发生了什么的任何想法?任何帮助将不胜感激!

4

1 回答 1

0

我使用TLIndexPathTools重现了您的场景并且没有崩溃。如果您想看一下,这里是来源。如果您逐步执行 中的方法performBatchUpdatesOnTableViewTLIndexPathUpdates您可以确切地看到执行了哪些批量更新。当我逐步检查自己时,我可以从您所描述的内容中看到的唯一区别是部分在行之前被删除。我尝试颠倒顺序(在部分之前删除行)并且它确实崩溃了。不过,我没有看到幽灵部分。

所以,我会尝试在行之前删除部分。如果这不起作用,我认为问题出在您提供的信息之外。如果您可以发布更多源代码或示例项目,我会再看一下。

于 2013-07-12T20:26:15.967 回答