UICollectionView 底部的 UIRefreshControl(加载更多数据)

Posted

技术标签:

【中文标题】UICollectionView 底部的 UIRefreshControl(加载更多数据)【英文标题】:UIRefreshControl at Bottom of UICollectionView (load more data) 【发布时间】:2016-06-14 14:20:11 【问题描述】:

我有一个UICollectionView,它显示来自在线数据库的图像。我首先加载 10 张图片,然后当用户滚动到 UICollectionView 的底部时,我在后台加载另外 10 张图片并刷新视图。我使用以下方法完成此操作:

func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) 
    if (self.localFeedContent != nil && self.localFeedContent!.count > 0) 
         if indexPath.item == (self.localFeedContent!.count-1) 
        loadMoreData()
    
    


现在这一切正常,但是没有向用户表明该过程已完成,除非他进一步向下滚动,否则他不会注意到已添加新内容。我想实现一个UIRefreshControl,它将附加到UICollectionView 的底部,并模仿与屏幕顶部的常规UIRefreshControl 完全相同的行为。我已经在屏幕顶部实现了一个,但是我不确定如何在底部执行此操作。

【问题讨论】:

【参考方案1】:

我写过类似的东西——我在底部返回另一个单元格,它只显示UIActivityIndicator。因此,您的数据源将类似于:

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    return array.count + 1


func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 

    if indexPath.item == array.count
        // return the new UICollectionViewCell with an activity indicator
    
    // return your regular UICollectionViewCell


func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) 
    if indexPath.item == array.count
        // loadMoreData()
    

或者不是在willDisplayCell 中调用loadMoreData(),您可以在cellForItemAtIndexPath 方法中调用它(当您返回带有UIActivityIndicator 的新UICollectionViewCell 时)。两者都可以。

【讨论】:

我不确定你为什么在 collectionView 中使用 indexPath.row,可能你的意思是 indexPath.item? @xaphod 都可以,但我会编辑我的答案以使用.item,因为它可能与 UICollectionView 更相关 :) 一旦没有更多页面要加载,您如何隐藏该新单元格? @Halpo 如果您正在跟踪是否可以加载更多页面的布尔值,例如canLoadNextPage,然后在numberOfItems 方法中返回canLoadNextPage ? array.count + 1 : array.count。希望有帮助!【参考方案2】:

您不需要在底部实现UIRefreshControl,只需实现scrollView 方法即可在滚动到达屏幕底部时执行一些操作。您可以在条件中使用一些标志来获得更具体的操作。

override func scrollViewDidScroll(scrollView: UIScrollView) 
        let threshold = 100.0 as CGFloat!
        let contentOffset = scrollView.contentOffset.y
        let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;
        if (maximumOffset - contentOffset <= threshold) && (maximumOffset - contentOffset != -5.0)             //Add ten more rows and reload the table content.

            runMoreAPI()
        
    

【讨论】:

关键是要有一个API正在加载数据的指示器。 我在底部看不到 Refresh 控件实现这个方法@kileros 此方法在滚动到达屏幕底部时执行runMoreApi()。这个想法是:到达底部时,刷新

以上是关于UICollectionView 底部的 UIRefreshControl(加载更多数据)的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法自动滚动到 UICollectionView 的底部

在 iOS 的 UICollectionview 底部添加按钮

在 UICollectionView 底部加载其他单元格

在 UICollectionView 的底部添加额外的单元格

有没有办法自动滚动到UICollectionView的底部

uicollectionview 在底部滚动加载更多数据。 iOS 斯威夫特