滚动到顶部时在表格视图的开头动态添加行
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 直到滚动到顶部时,文本视图中的子视图按钮消失