swift - UIrefreshcontrol 不会使用分页重新加载新项目
问题描述
我已经导入了一个名为 PaginatedTableView 的可可豆荚,它内置了 UIRefreshControl 和 Pagination 功能。当我拉起页面时,应用程序由于索引超出范围错误而崩溃,我认为这是由于 Refreshcontrol 而发生的。
我试图找出错误在哪里,但看起来还不错。
lazy var refreshControltableView: UIRefreshControl = {
let refreshControl = UIRefreshControl()
refreshControl.attributedTitle = NSAttributedString(string: "Pull to refresh")
refreshControl.addTarget(self, action: #selector(self.handleRefreshtableView(_:)), for: UIControl.Event.valueChanged)
return refreshControl
}()
extension PaginatedTableView {
public func loadData(refresh: Bool = false) {
load(refresh: refresh)
}
@objc fileprivate func handleRefreshtableView(_ refreshControl: UIRefreshControl) {
load(refresh: true)
}
// All loading logic goes here i.e. showing/hiding of loaders and pagination
private func load(refresh: Bool = false) {
// reset page number if refresh
if refresh {
currentPage = firstPage
hasMoreData = true
}
// return if already loading or dont have any more data
if !hasMoreData || isLoading {
return }
// start loading
isLoading = true
paginatedDelegate?.loadMore(currentPage, pageSize, onSuccess: { hasMore in
self.hasMoreData = hasMore
self.currentPage += 1
self.isLoading = false
self.refreshControltableView.endRefreshing()
if self.customReloadDataBlock != nil {
self.customReloadDataBlock?()
} else {
self.reloadData()
}
}, onError: { _ in
self.refreshControltableView.endRefreshing()
self.isLoading = false
})
}
// Scroll to end detector
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
let height = scrollView.frame.size.height
let contentYoffset = scrollView.contentOffset.y
let distanceFromBottom = scrollView.contentSize.height - contentYoffset
if distanceFromBottom < height {
load()
}
}
}
func loadMore(_ pageNumber: Int, _ pageSize: Int, onSuccess: ((Bool) -> Void)?, onError: ((Error) -> Void)?) {
// Call your api here
if pageNumber < pages - 1 {
onSuccess?(true)
print("success")
}
else {
onSuccess?(false)
}
// Send true in onSuccess in case new data exists, sending false will disable pagination
// If page number is first, reset the list
if pageNumber == 0 {
cleaner()
}
myApi(pageNumber)
// else append the data to list
// If Api responds with error
// Else end success with flag true if more data available
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as! myTableCell
cell.myLabel.text = self.labelArray[indexPath.row]
cell.myImage.image = self.imageArray[indexPath.row]
cell.myDateLabel.text = self.labelDateArray[indexPath.row]
return cell
}
loadMore 函数在委托类中。myApi 函数查找数据并将其附加到列表中。这是我认为与我的问题有关的 Pod 代码。提前致谢。
解决方案
推荐阅读
- javascript - 如何将事件侦听器添加到 React 应用程序中嵌入的 (YouTube) 视频?(我们无法控制视频 HTML)
- sql - SQL:计算列值从前一行发生变化的行
- javascript - 如果设置为 true,Webpack 最小化选项会中断应用程序
- azure - 使用 PowerShell 和 ServicePrincipal 为 AD 用户授予 Azure SQL 访问权限
- laravel - 我如何在控制器索引 Laravel 7 中检查身份验证
- laravel - 结合集合和关系 Eloquent
- javascript - Discord.js V12 找到一个以某事开头的角色
- python - 为什么遵循 Couchbase 异步 Python 代码不起作用?
- php - 所有路线工作正常,但新创建的路线在 laravel 中返回 404
- python - 如何在非重叠间隔上滚动系列元素