Swift代码库之分页完整流程含代码

it2025-08-21  4

运作效果

载入更多.gif

之前相关准备

Swift代码库之分页Sqlite部分代码与逻辑Swift代码库之分页UI部分基础代码

1. 编写一个RFPages对象来管理分页

该class有两种功能:

负责存储分页相关的sql语句,每页数量,行数,页数负责读取下一页,并返回结果

下面是RFPages源代码

import Foundation import UIKit class RFPages { var sql:String! var total:Int! var rowNum:Int! var step:Int! var page:Int! var db:RFWordDB! func initBySql(sql:String,step:Int){ self.db=MyManager.sharedInstance.wordDB self.sql = sql self.rowNum = self.db.getPages(sqlStr: self.sql) self.total = self.rowNum/step self.step = step self.page = 0 } func isHasNext()-> Bool { if (self.page<=self.total){ return true } return false } func nextPage()-> [FRWord]{ var rs = [FRWord]() if isHasNext(){ let qSql=self.sql + " limit \(self.step*1 ) offset \(self.page*self.step )" print(qSql) rs=self.db.getPageList(sql: qSql) self.page=self.page+1 return rs } else{ return rs } } }

2. 在Viewcontroller里面使用

定义一个pageDB变量在viewDidLoad()函数添加 // 创建对象 pageDB = RFPages() //初始化pageDB,设置sql和step pageDB?.initBySql(sql: "select * from mword ", step:20) //读取第一页 if ((pageDB?.isHasNext())!){ wordList = (pageDB?.nextPage())! }

下面是ViewController的代码

var pageDB:RFPages? override func viewDidLoad() { super.viewDidLoad() pageDB = RFPages() pageDB?.initBySql(sql: "select * from mword ", step:20) if ((pageDB?.isHasNext())!){ wordList = (pageDB?.nextPage())! } }

3. 设置tableview

设置三个section,第一个section显示查询结果,第二部section用于存储数据,第三个用于放置载入更多按钮添加三个tableviewcell设置查询结果cell和载入更多cell Jietu20190803-094452@2x.jpg func numberOfSections(in tableView: UITableView) -> Int { return 3 } func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if (indexPath.section == 0) { return 70 } else if (indexPath.section==1) { return 80 } else{ return 70 } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if (section == 1) { return wordList.count } else{ return 1 } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { if (indexPath.section == 0){ let cell = tableView.dequeueReusableCell(withIdentifier: "headercell", for: indexPath) //cell.textLabel?.text="请点击载入更多" self.headerCell=cell as? RFHeaderCell self.headerCell.myLabel?.text="\( self.pageDB!.rowNum*1) 条,共\( self.pageDB!.total*1)页" return cell } if (indexPath.section == 2){ let cell = tableView.dequeueReusableCell(withIdentifier: "loadmorecell", for: indexPath) //cell.textLabel?.text="请点击载入更多" self.footerCell = cell as? RFFooterCell self.footerCell.myLabel.text = "第\(self.pageDB!.page*1)页,点击加载更多" return cell } }

4. 响应点击载入更多函数

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if (indexPath.section == 0) { return } else if (indexPath.section==1) { let oneWord = wordList[indexPath.row] let dvc=WDetailVC(wordItem: oneWord) self.navigationController?.pushViewController(dvc, animated: true) } else{ self.perform(#selector(loadTable), with: nil, afterDelay: 0.5) return } }

5. 载入数据时,别忘了帮助用户滚动到之前看到位置

@objc func loadTable() { if ((self.pageDB?.isHasNext())!){ let rowNum=self.wordList.count-1 self.wordList=self.wordList+(self.pageDB?.nextPage())! self.tableView.reloadData() self.tableView.scrollToRow(at: [1,rowNum], at: .middle, animated: true) } // }

往期精彩

请点击,免费订阅《学Swift挣美元》专栏 赚钱App研究之生成代码app 赚钱App研究之格式转换类app
最新回复(0)