Swift UIrefreshcontrol不';t使用分页重新加载新项目
我已经导入了一个cocoa pod,即PaginatedTableView,它内置了UIRefreshControl和分页功能。当我打开页面时,由于索引超出范围错误,应用程序崩溃,我认为这是由于刷新控制造成的 我试着找出错误的地方,但似乎没有问题Swift UIrefreshcontrol不';t使用分页重新加载新项目,swift,cocoapods,pull-to-refresh,Swift,Cocoapods,Pull To Refresh,我已经导入了一个cocoa pod,即PaginatedTableView,它内置了UIRefreshControl和分页功能。当我打开页面时,由于索引超出范围错误,应用程序崩溃,我认为这是由于刷新控制造成的 我试着找出错误的地方,但似乎没有问题 lazy var refreshControltableView: UIRefreshControl = { let refreshControl = UIRefreshControl() refreshControl.attribut
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
}
lazy var refreshControltableView:UIRefreshControl={
让refreshControl=UIRefreshControl()
refreshControl.attributedTitle=NSAttributedString(字符串:“拉入刷新”)
refreshControl.addTarget(self,action:#选择器(self.handleRefreshtableView(35;:)),用于:UIControl.Event.valueChanged)
返回刷新控制
}()
扩展分页表视图{
公共函数加载数据(刷新:Bool=false){
加载(刷新:刷新)
}
@objc fileprivate func HandlerRefreshTableView(refreshControl:UIRefreshControl){
加载(刷新:真)
}
//所有加载逻辑都在这里,即显示/隐藏加载程序和分页
私有函数加载(刷新:Bool=false){
//如果刷新,则重置页码
如果刷新{
当前页=第一页
hasMoreData=true
}
//如果已经加载或没有更多数据,则返回
如果!hasMoreData | |正在加载{
返回}
//开始加载
isLoading=true
paginatedDelegate?.loadMore(当前页面,页面大小,onSuccess:{hasMore in
self.hasMoreData=hasMore
self.currentPage+=1
self.isload=false
self.refreshControltableView.endRefreshing()
如果self.customReloadDataBlock!=nil{
self.customReloadDataBlock?()
}否则{
self.reloadData()
}
},onError:{in
self.refreshControltableView.endRefreshing()
self.isload=false
})
}
//滚动到结束检测器
公共函数scrollViewDidScroll(scrollView:UIScrollView){
让高度=scrollView.frame.size.height
让contentYoffset=scrollView.contentOffset.y
让distanceFromBottom=scrollView.contentSize.height-contentYoffset
如果距离底部<高度{
加载()
}
}
}
func loadMore(uPageNumber:Int,pageSize:Int,onSuccess:((Bool)->Void)?,onError:((Error)->Void)?){
//在这里调用api
如果页码<第1页{
成功吗?(对)
打印(“成功”)
}
否则{
成功吗?(错误)
}
//onSuccess中发送true如果存在新数据,发送false将禁用分页
//如果页码在前,请重置列表
如果pageNumber==0{
清洁剂()
}
myApi(页码)
//否则将数据追加到列表中
//如果Api响应错误
//如果有更多数据可用,则使用标志true结束成功
}
func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
让cell=tableView.dequeueReusableCell(标识符为:“myCell”,表示:indexPath)为!myTableCell
cell.myLabel.text=self.labelArray[indexPath.row]
cell.myImage.image=self.imageArray[indexPath.row]
cell.myDateLabel.text=self.labelDateArray[indexPath.row]
返回单元
}
loadMore函数位于委托类中。myApi函数查找数据并将其附加到列表中。
这是我认为与我的问题有关的Pod代码。提前感谢。您知道是哪一行导致了错误吗?尝试在Xcode中设置异常断点。然后你就会知道是什么导致了超出范围的错误。我添加了它,但什么也没发生。实际上,我的错误在cellforrowat函数中,因为列表索引超出范围。我想当我刷新tableview时,我会删除列表,但当我向下滚动时,它不会重新加载。请在我刚刚添加的
cellForRowAt中共享您的代码。可能是三个数据数组中的一个不同步,导致了错误。我不使用三个不同的数组,而是使用具有三个属性的结构数组:label、image和labelDate。