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

运作效果

载入更多.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
 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

你可能感兴趣的:(Swift代码库之分页完整流程含代码)