UITableView在批量行和节删除后要求出现鬼节,导致崩溃

时间:2013-07-12 00:29:03

标签: ios objective-c crash uitableview

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

在我调用表删除行和部分之前,我确保所有行和部分都不在我的数据源中。我的2d数组正在正确更新,以便数组的新大小为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(这是预期的),它应该在那里结束。但它没有,它然后通过我一节= 6。

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

1 个答案:

答案 0 :(得分:0)

我使用TLIndexPathTools重现了你的场景并且没有发生崩溃。如果你想看一下,这里是the source。如果您单步执行performBatchUpdatesOnTableView中的方法TLIndexPathUpdates,则可以准确了解执行的批量更新。当我介入自己时,我能从你所描述的内容中看到的唯一区别是在行之前删除了部分。我尝试颠倒顺序(删除部分之前的行)并且它确实崩溃了。但是,我没有看到幽灵部分。

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