Swift代码库之分页完整流程含代码
2019-08-03 本文已影响5人
iCloudEnd
运作效果

之前相关准备
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

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)
}
//
}