【问题标题】:Infinite scroll tableView, swift无限滚动tableView,swift
【发布时间】:2020-07-11 22:01:02
【问题描述】:

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

我做的是:

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 在我的视图模型中管理,当我调用 load more Data 时,页码增加 1。

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

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

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

【问题讨论】:

标签: ios swift uitableview pagination infinite-scroll


【解决方案1】:

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

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
}

尝试一次。

【讨论】:

  • 您的解决方案很棒,但我仍然遇到同样的问题。在 loadMoreData 中,我将页数增加 1,并且我正确管理 paginationFinished,但是如果我在页面末尾滚动时打印页数,我会看到 1、2、3、4 等。这是相同的行为 =(
  • 附言。在我加载更多数据的调用中,我有页码和页面大小,所以后面的一切都工作正常,我认为问题就在这里
  • @jamesCode 更新了我的答案。可以试试吗?
【解决方案2】:

你需要做一些标记

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
        }
    }
}

【讨论】:

  • 请您准备好我写给 Shashank Mishra 的评论好吗?我有同样的场景,这很奇怪 =/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多