我需要在用户滚动时动态更新表格视图。我正在显示来自一个巨大数据库的数据,所以为了内存管理,我使用以下代码在用户滚动时动态更新表。我所做的是,当 tableView 加载indexPath.row == 30
并且用户向下滚动并从开头删除 30 行时,我通过在表的末尾添加 30 行来更新 tableView。类似地,当indexPath.row == 20
用户向上滚动时,30 行添加到开头,30 行从结尾开始删除。下面的条件写成tableView:cellForRowAtIndexPath
if ((indexPath.row == 30) && isDown) {
[self addRowsToBeginningOfTable];
}
if ((indexPath.row == 20) && isUp) {
[self addRowsToEndOfTable];
}
在这种情况下,当用户向上滚动时 isDown 为真,当用户向下滚动时 isUp 为真(我知道这很奇怪,但 isUp 和 isDown 是用户的滑动方向)。和addRowsToBeginningOfTable
如下addRowsToEndOfTable
所示:
- (void)addRowsToEndOfTable {
NSInteger rowCount = [arrayOfText count];
int rowId = [[arrayOfText objectAtIndex:rowCount-1]intValue];
for (int i = 0; i < 30; i++) {
NSIndexPath *indexPathEnd = [NSIndexPath indexPathForRow:i+rowCount inSection:0];
NSIndexPath *indexPathBeginning = [NSIndexPath indexPathForRow:i inSection:0];
[tableView beginUpdates];
[arrayOfText insertObject:@"New Object" atIndex:--rowId];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPathEnd] withRowAnimation:UITableViewRowAnimationNone];
[arrayOfText removeObjectAtIndex:i];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPathBeginning] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates]; //exception breakpoint hits here
}
}
- (void)addRowsToBeginningOfTable {
NSInteger rowCount = [arrayOfText count];
int rowId = [[arrayOfText objectAtIndex:0]intValue];
for (int i = 0; i < 30; i++) {
NSIndexPath *indexPathEnd = [NSIndexPath indexPathForRow:i+rowCount inSection:0];
NSIndexPath *indexPathBeginning = [NSIndexPath indexPathForRow:i inSection:0];
[tableView beginUpdates];
[arrayOfText addObjectAtIndex:i WithRowId:--rowId];
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPathBeginning] withRowAnimation:UITableViewRowAnimationNone];
[arrayOfText removeObjectAtIndex:i+rowCount];
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPathEnd] withRowAnimation:UITableViewRowAnimationNone];
[tableView endUpdates];
}
}
但是当我滚动 tableView 并indexPath.row == 30
满足条件时,应用程序崩溃并显示以下错误:
*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:909
我设置了一个异常断点,并看到它命中了上面代码中给出注释的行。我该如何纠正这个问题?或者,如果用户不知道在滚动时正在更新 tableView,这不是更新表格的正确方法吗?