数据较少时未在 UITableview 中调用 scrollViewDidEndDragging

Posted

技术标签:

【中文标题】数据较少时未在 UITableview 中调用 scrollViewDidEndDragging【英文标题】:scrollViewDidEndDragging not called in UITableview when data is less 【发布时间】:2018-10-15 07:04:28 【问题描述】:

我正在使用分页来显示管理多个数据。分页在顶部和底部两侧都有效。为此,我使用下面的代码来调用 API。但是当数据不大于tableView 高度时,我遇到了这个问题。在这种情况下,scrollViewDidEndDragging 方法未被调用。所以请告诉我如何解决这个问题。当数据大于tableView 高度时,下面的代码工作正常。

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) 
    if(scrollView.panGestureRecognizer.translation(in: scrollView.superview).y > 0) 
        print("up")
        if workerInfo.count > 0 
            let topVisibleIndexPath:IndexPath = self.tableView.indexPathsForVisibleRows![0]
            if topVisibleIndexPath.row == 0 && startCount != 0 && !isDataLoading 
                isDataLoading = true
                startCount = startCount - requiredCount
                self.callAPI(isCallFromPagination: true)
            
         
     
     else 
         print("down")
         if workerInfo.count > 0 
             let arrayOfVisibleItems = tableView.indexPathsForVisibleRows?.sorted()
             let lastIndexPath = arrayOfVisibleItems!.last
             //  print("Array: ", arrayOfVisibleItems)
             print("Last IndexPath: ", lastIndexPath as Any)
             if lastIndexPath?.row == workerInfo.count - 1 && !isDataLoading 
                 isDataLoading = true
                 startCount = startCount + requiredCount
                 self.callAPI(isCallFromPagination: true)
             
         
    

【问题讨论】:

你不能在 cellForItem 方法中做吗?如果 indexPath 是最后一次重新加载数据。 我想在用户向上或向下滚动时获取数据 是的,我知道,当您向下滚动时,您将到达 tableView 的最后一个元素,在那里您可以点击 API 并使用添加的数据重新加载 tableView。 对于分页,一个常见的做法是使用willDisplayCellAt加载额外的数据。 @inokey 但在这两种情况下我都想从 API 获取数据 【参考方案1】:

你能检查一下这个属性吗?在我的代码中它工作得很好。

extension ViewController: UIScrollViewDelegate 

func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) 
        print("Called")
   
  

【讨论】:

【参考方案2】:

您可以保留您的table view bouncescrollview 反弹True。然后调用 scrollViewDidEndDragging 方法

【讨论】:

tableView.bounces = true scrollView.bounces = true // 你在说这个吗? 是的。你也可以从情节提要中做到这一点。在表格视图中,您可以选择bounce on scroll。如果这是真的,则调用 scrollViewDidEndDragging 方法。 tableview只有3行可见时不调用 请查看我上传的截图。【参考方案3】:
// Support Pagination
extension TableViewController: UIScrollViewDelegate 

    // Set Pagination Trigger before DataSoruce remaining 6 items display
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 

        // Load More
        setupPaginationAt(indexPath)
    



    // If we reached at the end, check again if anything to load
    func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) 

        let bottomEdge = scrollView.contentOffset.y + scrollView.frame.size.height
        if (bottomEdge >= scrollView.contentSize.height) 

            // We are at the end
            setupPaginationAt(nil)
        
    



    func setupPaginationAt(_ indexPath: IndexPath?) 

        // If any network calls on the way, we must leave - Declare a Bool variable and manipulate the value of it
        if isLoading 

            return
        


        // Validation
        guard let _dataSource = YourDataSource else 

           print("DataSource found empty")
           return
        



        // Config Pagination Call
        func execute() 

            // Get Current Pagination - Hope you have page index's from API
            if let currentPage = dataSource.pageIndex, let lastPage = dataSource.totalPages 

                if currentPage < lastPage 

                    let nextPage = currentPage + 1
                    loadData(at: nextPage)
                
            
        


        // Check InBetween or End
        if let _indexPath = indexPath 

            if  _indexPath.row == _dataSource.count - 6 

                execute()
            
         else 

            // Assume End
            execute()
        
    

这个解决方案应该可以工作。

【讨论】:

我想在用户向上滚动和向下滚动时始终获取最新数据。您的解决方案适用于向下滚动的案例。但是如何在向上滚动的情况下获取数据。 您可以通过检查当前偏移方向来应用scrollViewWillBeginDecelerating的逻辑。

以上是关于数据较少时未在 UITableview 中调用 scrollViewDidEndDragging的主要内容,如果未能解决你的问题,请参考以下文章

numberOfRowsInSection:未在 reloadData 上调用

在RBF神经网络预测中,如果样本数据较少时,效果怎么样?和GRNN神经网络比较

使用 nsfetchedresultscontroller 时,未在 uitableview 中自动重新加载数据

数据未在 UITableView 中加载。可能是啥问题?

XML Parse 后未在 UITableView 中获取当前数据(使用 NSFetchedResultsController)

并行线程中的多个 dbcontexts,EntityException “当活动用户较少时重新运行您的语句”