scrollViewDidScroll在swift中多次调用

时间:2016-05-19 18:32:15

标签: ios swift uiscrollview

我有一个UIScrollView内有一个UITableView。我已禁用UITableView的滚动所以我只想检查我的滚动视图是否已到达底部,如果这样调用加载更多的表函数。所以我为此做了类似的事。

func scrollViewDidScroll(scrollView: UIScrollView) {



        if (scrollView.contentOffset.y >= (scrollView.contentSize.height - scrollView.frame.size.height)) {
            //reach bottom
            self.startRec+=10
            self.jsonParser()
        }

        else if (scrollView.contentOffset.y < 0){
            //reach top
        }

        else if (scrollView.contentOffset.y >= 0 && scrollView.contentOffset.y < (scrollView.contentSize.height - scrollView.frame.size.height)){
            //not top and not bottom
        }
}

但我的问题是,当我滚动它时,似乎多次调用此jsonParser()。我怎么解决这个问题?请帮我。 感谢

3 个答案:

答案 0 :(得分:0)

您可以向类中添加一个实例变量,以跟踪jsonParser的运行时间。如果它已经运行,那么返回时不做任何事情。只有当jsonParser还没有运行时,你才需要增加startRec。类似的东西:

encode

答案 1 :(得分:0)

您是否有理由在滚动视图中子视图表视图?我的意思是表视图是scrollview的子类,使用tableView的主要优点之一是dequeueCell方法。

只需将tableview放在视图控制器中的所需位置,然后使用委托函数

,就可以从应用程序中获得更好的性能。

func tableView(_:willDisplayCell:forRowAtIndexPath:)

在这个委托方法中你可以调用你的jsonParser,如果进入视图的单元格是,数据源末尾有3-5个索引

func tableView(_:willDisplayCell:forRowAtTndexPath:) {
    if (indexPath.row == resultsArray.count - 3) {
        //load your extra data

        self.startRec+=10
        self.jsonParser()
    }

当然,您可以将数字3更改为您想要的任何内容,但这会产生这样一种情况,即只要表格接近数据源的末尾,您的jsonParser()就会被调用,并且您将获得使用出队单元的好处。

以下是Apple博客文档的链接,如果您想要参考:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/#//apple_ref/occ/intfm/UITableViewDelegate/tableView:willDisplayCell:forRowAtIndexPath

我使用相同的方法处理我为无限滚动创建的集合视图。

-(void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.item == self.arrCollectionData.count - 5) {
        [self.myWebService startWebServiceRequestWithURL:_currentURL];
    }
} 

答案 2 :(得分:0)

当用户启动,拖动,然后从他们的设备抬起手指时,会多次调用UIScrollViewDelegate个方法。您应该检查现有的解析器,如果有一个只是返回而不是运行新的解析器。

jsonParser()内部:

func jsonParser() {

   if /* JSON is in process */ {
      return
   }

   // process then clean up

}

这会阻止您的代码多次触发。只需确保正确管理您的州。