XZ_Swift之使用苹果原生UIRefreshControl实现下拉刷新和上拉加载

实现的效果图
这里写图片描述

系统的 UIRefreshControl 的属性很少,就只有下面几个:
isRefreshing: Bool 判断是否正在刷新
tintColor: UIColor! 修改菊花的颜色,默认是灰色的
attributedTitle: NSAttributedString? 给刷新添加文字显示
beginRefreshing() 开始刷新
endRefreshing() 结束刷新

因为 UIRefreshControl 是继承自 UIControl,所有UIControl 的方法,他都可以使用,常用的有 添加事件
addTarget(_ target: Any?, action: Selector, for controlEvents: UIControlEvents)

实现的主要核心处理部分是上拉加载:上拉加载需要做无缝加载,需要判断是不是最后一个 section 的最后一行,如果是,拖拽时进行 上拉加载 并刷新页面

代码实现:

private let cellId = "XZTableViewCell"

class ViewController: UIViewController {

    private var tableView: UITableView?
    // 懒加载数据数组
    private lazy var dataArr = [String]()
    // 判断是否是上提加载
    var isPullUp = false
    // 刷新控件
    var refreshControl: UIRefreshControl?

    override func viewDidLoad() {
        super.viewDidLoad()
        // 设置页面
        setupUI()
        // 加载数据
        loadData()
    }

    @objc private func loadData() {
        // 模拟数据延时
        DispatchQueue.main.asyncAfter(wallDeadline: .now() + 2) {
            print("开始加载数据")
            if self.isPullUp { // 上提加载
                for i in 0..<20 {
                    self.dataArr.append("加载 - 第\(i.description)行")
                }
            }else { // 下拉刷新
                self.dataArr.removeAll()
                for i in 0..<20 {
                    self.dataArr.append("第\(i.description)行")
                }
            }

            print("==========\(self.isPullUp)")
            self.isPullUp = false
            // 结束刷新
            self.refreshControl?.endRefreshing()
            // 刷新数据
            self.tableView?.reloadData()
            print("结束加载数据")
        }
    }

}

// MARK: - 设置页面
extension ViewController {

    private func setupUI() {
        // 初始化tableView
        tableView = UITableView(frame: view.bounds, style: .plain)
        view.addSubview(tableView!)

        tableView?.backgroundColor = .white

        tableView?.delegate = self
        tableView?.dataSource = self

        tableView?.register(UITableViewCell.self, forCellReuseIdentifier: cellId)

        // 设置刷新控件
        refreshControl = UIRefreshControl()
        tableView?.addSubview(refreshControl!)

        refreshControl?.addTarget(self, action: #selector(loadData), for: .valueChanged)
    }

}

// MARK: - UITableViewDelegate,UITableViewDataSource
extension ViewController: UITableViewDelegate,UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataArr.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)

        cell.textLabel?.text = dataArr[indexPath.row]

        return cell
    }

    // 上拉需要做无缝刷新,使用下面的方法:判断是不是最后一个 section 的最后一行,如果是,拖拽时进行 上拉加载 并刷新页面
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        // 当前行
        let row = indexPath.row
        // 最后一个section
        let section = tableView.numberOfSections - 1

        if row < 0 || section < 0 {
            return
        }
        // 最后一行
        let lastRow = tableView.numberOfRows(inSection: section) - 1

        if row == lastRow {
            isPullUp = true
            loadData()
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值