无限滚动 tableView,swift
Infinite scroll tableView, swift
通过一些研究,我发现这种方法对实现我的目的非常有用:在 table 视图中分页。
我做的是:
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 在我的 viewModel 中管理,当我调用加载更多数据时,页码增加 1。
问题是这段代码,当我向下滚动以加载更多数据时,会像所有可能的时间一样调用我的 viewModel 函数。
事实上,如果我在我的代码行打印一些东西,当我到达页面末尾时,它会打印 15 次。
这段代码有什么问题?我该如何改进呢?我想到达页面末尾并调用我的 loadMoreData 一次,以便它在 pageCounter 中加载数据。我想我错过了什么
你需要做一些标记
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
}
}
}
在 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
}
试一次。
通过一些研究,我发现这种方法对实现我的目的非常有用:在 table 视图中分页。
我做的是:
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 在我的 viewModel 中管理,当我调用加载更多数据时,页码增加 1。
问题是这段代码,当我向下滚动以加载更多数据时,会像所有可能的时间一样调用我的 viewModel 函数。
事实上,如果我在我的代码行打印一些东西,当我到达页面末尾时,它会打印 15 次。
这段代码有什么问题?我该如何改进呢?我想到达页面末尾并调用我的 loadMoreData 一次,以便它在 pageCounter 中加载数据。我想我错过了什么
你需要做一些标记
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
}
}
}
在 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
}
试一次。