繁体   English   中英

无限滚动tableView,swift

[英]Infinite scroll tableView, swift

通过一些研究,我发现这种方法对达到我的目的很有用:在表格视图中分页。

我要做的是:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let offsetY = scrollView.contentOffset.y
    let contentHeight = scrollView.contentSize.height
    
    if offsetY > contentHeight - scrollView.frame.height {

        //print

        if vievModel.!paginationFinished {
            self.viewModel.loadMoreData()
            self.tableView.reloadData()
        }
    }
}

变量 paginationFinished 在我的视图模型中管理,当我调用加载更多数据时,页码增加 1。

问题是,当我向下滚动以加载更多数据时,这段代码会像所有可能的时间一样调用我的 viewModel function。

事实上,如果我在代码行中打印一些内容,当我到达页面末尾时,它会打印 15 次。

这段代码有什么问题? 我该如何改进呢? 我想到达页面的末尾并调用我的loadMoreData一次,因此它将数据加载到 pageCounter 中。 我想我错过了什么

在 loadMoreData() 方法中添加完成处理程序并使用 boolean 检查调用,如下所示 -

var isLoadingStarted = true

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let offsetY = scrollView.contentOffset.y
    let contentHeight = scrollView.contentSize.height
    
    if offsetY > contentHeight - scrollView.frame.height {
        
        if vievModel.!paginationFinished && isLoadingStarted {
            isLoadingStarted = false
            self.viewModel.loadMoreData {
               self.tableView.reloadData()
               //self.isLoadingStarted = true
            }
            
        }
    }
}

//Handle loadMoreData method as below
static func loadMoreData(_ , completion:@escaping (() -> Void)) {
    .
    .
    .
    completion()
   
}

使用滚动视图委托来检测开始拖动并在那里设置标志 isLoadingStarted -

func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    self.isLoadingStarted = true
}

试一次。

你需要做一些标记

var isLoading = false

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let offsetY = scrollView.contentOffset.y
    let contentHeight = scrollView.contentSize.height
    
    if offsetY > contentHeight - scrollView.frame.height && !isLoading {

        //print

        if vievModel.!paginationFinished {
            isLoading = true
            self.viewModel.loadMoreData()
            self.tableView.reloadData()
            isLoading = false
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM