数据较少时未在 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
bounce
和scrollview
反弹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 中自动重新加载数据
XML Parse 后未在 UITableView 中获取当前数据(使用 NSFetchedResultsController)