• iOS: 与 insertRowsAtIndexPaths 在 UITableview 中插入多个行


    我有 10 行已经在连接中想做什么添加另一个 10 行,我使用的 insertRowsAtIndexPaths,但我要的错误。

    以下是我使用的代码

    -(void)insertDownloadedActions:(NSMutableArray *)dataToAdd
    {
            __weak CurrentViewController *weakSelf = self;

            int64_t delayInSeconds = 2.0;
            dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
            dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
                [weakSelf.tableView beginUpdates];
                [weakSelf.dataSource addObjects:dataToAdd];
                NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:[weakSelf.dataSource count]-dataToAdd.count-1 inSection:0];
                [weakSelf.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationTop];
                [weakSelf.tableView endUpdates];
            });
    }

    但我要为那下列错误

    Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0.  The number of rows contained in an existing section after the update (20) must be equal to the number of rows contained in that section before the update (10), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).

    解决方法 1:

    代码是密切,但表视图需要确切的对应与什么添加到数据源中要更新的索引路径。

    -(void)insertDownloadedActions:(NSMutableArray *)dataToAdd
    {
        // don't need this
        //__weak CurrentViewController *weakSelf = self;

        int64_t delayInSeconds = 2.0;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void) {

            // build the index paths for insertion
            // since you're adding to the end of datasource, the new rows will start at count
            NSMutableArray *indexPaths = [NSMutableArray array];
            NSInteger currentCount = self.datasource.count;
            for (int i = 0; i < dataToAdd.count; i++) {
                [indexPaths addObject:[NSIndexPath indexPathForRow:currentCount+i inSection:0]];
            }

            // do the insertion
            [self.dataSource addObjects:dataToAdd];

            // tell the table view to update (at all of the inserted index paths)
            [self.tableView beginUpdates];
            [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop];
            [self.tableView endUpdates];
        });
    }

    你想要避免周期哪里块所有者保留块和块 weakSelf (通过使用块所有者"自我") 保留所有者。有的 weakSelf 模式在这里没有必要因为视图控制器不保留在被派遣的块的副本。

  • 相关阅读:
    Angularjs html文本显示
    .net与.net core学习目录
    数据库学习目录
    WCF学习目录
    sql学习目录
    EF学习目录
    git for Windows
    图谱论(Spectral Graph Theory)基础
    2017机器学习相关会议时间
    数值分析教材统计
  • 原文地址:https://www.cnblogs.com/xiaoxiaoyublogs/p/5446271.html
Copyright © 2020-2023  润新知