ios - UITableView 分页不能准确快速地工作
问题描述
我已经在 UITableView 中实现了分页,但不知何故它不能完美地工作。如果我有时向下滚动,它Index out of bound error
甚至会让我无法向后滚动。其次,我无法向上滚动到最高记录。
- 页码在服务中很重要。
- 我在 tableView 中有部分。
var currentPage: Int = 0
var isLoadingList : Bool = false
服务:
func getListFromServer(_ pageNumber: Int){
self.isLoadingList = false
DataProvider.main.serviceGetData(SearchType: SearchType, PageNumber: pageNumber, callback: {success, result in
do{
if(success){
let decoder = JSONDecoder()
let response = try decoder.decode(ResponseData.self, from: result! as! Data)
self.Appdata = response.appointmentList
DispatchQueue.main.async {
self.tableView.reloadData()
}
return true
}else{
return false
}
}catch let error {
print(error as Any)
return false
}
})
}
分页和滚动代码:
func loadMoreItemsForList(){
currentPage += 1
switch currentPage {
case 1,2,3:
getListFromServer(currentPage)
default:
print("no data")
}
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if (((scrollView.contentOffset.y + scrollView.frame.size.height) > scrollView.contentSize.height ) && !isLoadingList){
self.isLoadingList = true
self.loadMoreItemsForList()
}
}
表视图代码:
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return Appdata?[section].date ?? ""
}
//
func numberOfSections(in tableView: UITableView) -> Int {
return Appdata?.count ?? 0
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return CGFloat(80)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return Appdata?[section].appointmentList?.count ?? 0
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "AppTableViewCell", for: indexPath) as! AppTableViewCell
let dic = Appdata![indexPath.section].appointmentList![indexPath.row]
cell.topLabel.text = dic.projectName
cell.midLabel.text = dic.subTitle
return cell
}
解决方案
首先,您每次都在替换数据源
self.Appdata = response.appointmentList
它应该是
self.Appdata?.append(contentsOf: response.appointmentListz ?? [])
其次,当获取数据集时 isLoadingList 为 true 以避免在滚动时发出许多请求,并在得到响应后再次使其为 false
func getListFromServer(_ pageNumber: Int){
DataProvider.main.serviceGetData(SearchType: SearchType, PageNumber: pageNumber, callback: {success, result in
self.isLoadingList = false
最后不要忘记在网络关闭时使用 [weak self]
func getListFromServer(_ pageNumber: Int){
DataProvider.main.serviceGetData(SearchType: SearchType, PageNumber: pageNumber, callback: { [weak self] success, result in
guard let self = self else { return }
self.isLoadingList = false
推荐阅读
- python-3.x - 如何让 Pandas 中的数组长度相同?
- angular - 离子显示 {{ data.name }} 仅在数据可用后(来自 HTTP)
- javascript - 当 onPaste 在 contenteditable div 内时,新行将变成空 div,例如, 代替
- c# - 企业库 6 登录到数据库和电子邮件在服务器上不起作用
- python - 在 windows 10 中使用 python 3.7 导入 tensorflow 时出错
- node.js - 获取标头响应 Nuxt Axios
- python - 如何在曲线旁边显示最后一个 Y 轴值?
- angular - 与子组件的角度 ChangeDetectionStategy.OnPush 应用程序混淆
- r - 如何更改 IDE RStudio 的语言?
- keras - 关于迁移学习中不可训练的层数