在我的UiTableView
中,我将动态数据加载到其中,当用户滚动到UITableView
i的底部时,然后加载更多项目并将它们插入到表格的底部。这没有问题。但是,如果用户加载项目,则删除一个项目并滚动到底部(要加载更多项目)应用程序崩溃。
从我可以解决的问题来看,在将项目插入table virew
时,dataSource或计数不匹配 - 我无法解决我出错的地方。
这是我正在使用的代码:
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];
当它在deleteSections
if语句中尝试loadingMore
时发生崩溃。控制台显示:
'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,这是正确的,因为我只删除了一个部分。那么,问题在哪里?
答案 0 :(得分:1)
在...beginUpdates
和...endUpdates
方法之间移动存储修改代码。