0

我需要在用户滚动时动态更新表格视图。我正在显示来自一个巨大数据库的数据,所以为了内存管理,我使用以下代码在用户滚动时动态更新表。我所做的是,当 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,这不是更新表格的正确方法吗?

4

0 回答 0