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

时间:2016-06-14 14:20:11

标签: ios swift asynchronous uicollectionview uirefreshcontrol

我有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相同的行为。我已经在屏幕顶部实现了一个,但我不知道如何在底部执行此操作。

2 个答案:

答案 0 :(得分:12)

我写了类似的东西 - 我在底部返回另一个显示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()
    }
}

或者不是在loadMoreData()中调用willDisplayCell,而是在cellForItemAtIndexPath方法中调用它(当您使用{{1}返回新的UICollectionViewCell时})。要么可以工作。

答案 1 :(得分:1)

您无需在底部实现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()
        }
    }