删除/插入行到 UITableView 时 UIKit 崩溃

Posted

技术标签:

【中文标题】删除/插入行到 UITableView 时 UIKit 崩溃【英文标题】:UIKit crash when deleting / inserting rows into UITableView 【发布时间】:2015-05-26 09:50:59 【问题描述】:

在我的UiTableView 中,我将动态数据加载到其中,当用户滚动到UITableView 的底部时,我会加载更多项目并将它们插入表格的底部。这没有问题。但是,如果用户加载项目,然后删除一个项目并滚动到底部(加载更多项目)应用程序崩溃。

据我所知,在将项目插入table virew 时,数据源或计数不匹配 - 我只是无法弄清楚我哪里出错了。

这是我正在使用的代码:

NSIndexSet  *indexSectionsToInsert = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(questionsCount, [questions.questionsAndAnswersArray count])];


[self.tableView beginUpdates];

if (loadingMore)

    NSIndexPath *indexSectionsToDelete = [NSIndexPath indexPathForItem:0 inSection:[currentArray count]];

    [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:indexSectionsToDelete.section] withRowAnimation:UITableViewRowAnimationTop];
    [self.tableView setContentInset:UIEdgeInsetsMake(0, 0, 0, 0)];
    loadingMore = NO;


[self.tableView insertSections:indexSectionsToInsert
          withRowAnimation:UITableViewRowAnimationTop];


[currentArray addObjectsFromArray:questions.questionsAndAnswersArray];

[self.tableView endUpdates];

当它在loadingMore if 语句中尝试deleteSections 时会发生崩溃。控制台显示:

'NSInternalInconsistencyException',原因:'无效更新:无效的节数。更新后表视图中包含的节数(25)必须等于更新前表视图中包含的节数(25),加上或减去插入或删除的节数(0插入,1已删除)。'

但是,当我检查我的计数时,它们似乎都是正确的。它们都是 24,这是删除后 tableview 中的当前节数。

它一次将 25 个项目加载到 tableview 中。

这是崩溃发生前索引的样子:

删除

<NSIndexPath: 0xc000000000000616> length = 2, path = 24 - 0

我认为这是“删除第 0 到 24 节”——在我看来是正确的。

然后插入:

<NSIndexSet: 0x7f84c65ed0b0>[number of indexes: 25 (in 1 ranges), indexes: (24-48)]

我将其视为“插入第 24 至 48 节”——在我看来这是正确的。

我在正常加载条件下而不是在删除后查看了上述索引,它工作正常:这是索引的样子:

删除

<NSIndexPath: 0xc000000000000616> length = 2, path = 25 - 0

然后插入:

<NSIndexSet: 0x7f84c65ed0b0>[number of indexes: 25 (in 1 ranges), indexes: (25-49)]

所以只减 1,这是正确的,因为我只删除了一个部分。那么,问题出在哪里?

【问题讨论】:

据我所知,删除部分时您不会修改存储空间 (currentArray?)。这似乎是导致崩溃的原因。 对不起,我应该提到,在 tableViews commitEditingStyle 方法中被修改,当我检查计数 9 时,当前数组确实反映了这一点,在这种情况下是 24) 如果在...beginUpdates...endUpdates 方法之间移动存储修改代码会怎样?我昨天在一个应用中实现了类似的功能,它运行良好。 问题解决了。似乎在我的 commitEditingStyle 方法中,我忘记添加 ...beginUpdates 并且在修改存储后只有 ..endUpdates ,所以不匹配。请将您的最后评论放入答案中,以便我标记它。谢谢! :) 完成。很高兴有帮助! 【参考方案1】:

...beginUpdates...endUpdates 方法之间移动您的存储修改代码。

【讨论】:

以上是关于删除/插入行到 UITableView 时 UIKit 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

插入和删除时发生 UItableview 动画崩溃

删除和插入具有不同高度的单元格时,UITableView 动画故障

为啥我的 UITableView 在插入或删除行时会“跳跃”?

vim技巧3

从 JSONArray 插入/更新 +10000 行到 SqLite 时如何防止应用程序崩溃

UITableView 中同时插入/删除行的问题