滚动到顶部时在表格视图的开头动态添加行

Posted

技术标签:

【中文标题】滚动到顶部时在表格视图的开头动态添加行【英文标题】:Dynamically add rows at the beginning of the table view while scrolling to top 【发布时间】:2014-10-03 19:10:31 【问题描述】:

我有一个数组,集合视图在创建单元格时使用数组中的数据。当我的collectionview几乎在顶部时,我在数组的开头添加了一些对象。我正在使用这种方法来确定是否该加载新项目和部分并添加它们

-(void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath

    if(indexPath.section < sectionLimitBeforeLoadingMoreSections) 
    
         // add some objects at the beginning of the array
    

但我可以轻松使用其他方法(即 scrollViewDidScroll)。

所以我有一个问题,当我将项目添加到数组和 reloadData 时,我的集合视图 contentOffset 没有改变,所以一旦调用这个方法,它就会被越来越多地调用,并使 CPU 以 100% 的速度无限工作。

示例:我有 20 个部分,初始位置是中心部分(10)。我开始滚动到顶部,当我到达第 4 节时,数组中添加了 10 个以上的项目(这意味着要出现 10 个以上的部分)。所以第 4 节现在必须变成第 14 节。确实如此,但是我的 scrollView contentOffset 没有改变,并且新的第 4 节立即可见,因此它再次调用此方法以添加 10 个以上的项目,依此类推。

当我使用此方法在数组末尾添加对象时,它工作正常。部分被添加到底部,我可以很好地滚动。

我想到了一个解决方案来确定所有添加的新部分的高度,并将这个值添加到当前的 contentOffset,但我不知道如何计算高度。


更新:

  if(indexPath.section < sectionLimitBeforeLoadingMoreSections) // load @ beginning
    
        if(!self.isLoading)
        
            self.isLoading = YES;
            CGFloat height = self.contentSize.height;
            [self performBatchUpdates:^
             
                 [self loadNewMonthsAtTheBeginning:10];
                 [self insertSections:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 10)]];
             
                           completion:^(BOOL finished)
             
                self.contentOffset = CGPointMake(self.contentOffset.x,self.contentOffset.y + self.contentSize.height - height);
                 self.isLoading = NO;
             ];
        
    

似乎工作得很好,但是在执行批处理时我有点卡住,有什么办法可以避免这种情况吗?

【问题讨论】:

您的问题解决了吗?我也面临同样的问题。 【参考方案1】:

如果你被冻结,那么我会假设 loadNewMonthsAtTheBeginning 在主线程上使用了太多的处理时间,你应该考虑在另一个线程中执行在那里完成的工作。

如果是网络连接,考虑使用异步调用,比如这里提到的:how to send Asynchronous URL Request?

否则你可以使用 GCD

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^
    // Code run on non UI thread to perform tasks such as loadNewMonthsAtTheBeginning
    dispatch_async(dispatch_get_main_queue(), ^
        // UI thread to perform insertSections
    );
);

【讨论】:

我尝试发送,没有成功。相同的方法,将数据添加到数组的末尾(例如,在集合视图的末尾添加部分)工作顺利:( 我猜它并没有真正冻结,但是因为我在插入新部分后设置了内容偏移量,它会向后滚动到它原来的位置,看起来像冻结了。

以上是关于滚动到顶部时在表格视图的开头动态添加行的主要内容,如果未能解决你的问题,请参考以下文章

更改 NSMutableAttributedString 直到滚动到顶部时,文本视图中的子视图按钮消失

UITableViewcontentInset:当滚动表格到顶部时,行在第一个标题上方仍然可见

将文本字段动态添加到表格视图单元格并水平滚动

滚动到顶部时删除类

添加课程到我的 使用jQuery滚动时

如何将 UITableView 的高度调整为内容大小的高度?