關於MJRefresh 上拉刷新無法停止的解決方法


事件詳情:tableView上拉后不斷刷新,基本上無法停止.

出現該事件的場景:在tableView中添加了多個自定義的Cell,當cell的總高度超出屏幕時即出現事件.下拉刷新無法回收並持續刷新.

 

解決方案:

以下是我對MJRefresh的功能封裝.注意下面代碼中紅色部分.MJRefresh中定義了多個Header和Footer刷新類型.用錯類型會導致不確定的問題發生.

之前導至我持續刷新的類是  MJRefreshAutoNormalFooter 我將其更換成 MJRefreshBackNormalFooter 后就沒有更出現類似問題了.

 

另外如果在停止刷新時表格會出現跳一下(抖一下)等情況時.使用

self.tableView.mj_header.endRefreshing { weakSelf.tableView.reloadData() } 在加載動畫結束block或swift閉包回調中再做數據刷新就不會有這個問題了.

其它碰到的問題

刷新完后表格仍然向上跳一節.但不會抖

1.可能是 tableView!.estimatedRowHeight 值設置過小.我試着加大了該值.表格就不跳了.

2.約束錯有誤.詳細查看右下角的輸出信息.如果有出現約束問題.解決就好了.

 

追加:因轉戰swift貼出swift中的個人封裝.僅供參考.

 

**********************************分隔****************************************

 

import Foundation

import UIKit

import MJRefresh

extension UITableView { // 對tableView寫一個擴展 

    

    //MARK:---- header ----

    

    /// 全局配置

    ///

    /// - Parameter header: mj_header

    private class func xh_MJRefreshHeader(header:MJRefreshNormalHeader) {

        header.isAutomaticallyChangeAlpha = true

    }

    

    /// mjheader刷新

    ///

    /// - Parameter completionHandle: 回調(配置刷新需要做的事)當header刷新時調用

    /// - Returns: 返回MJRefreshNormalHeader,如需要特殊配置時可接收使用.

    @discardableResult func xh_MJRefreshHeader(completionHandle:@escaping MJRefreshComponentRefreshingBlock) -> MJRefreshNormalHeader {

        let header = MJRefreshNormalHeader.init(refreshingBlock: completionHandle)

        self.mj_header = header

        UITableView.xh_MJRefreshHeader(header: header!)

        return header!

    }

    

    /// mjheader刷新

    ///

    /// - Parameters:

    ///   - IdleTitle: 空閑狀態標題

    ///   - WillRefreshTitle: 即將刷新(拖動時)標題

    ///   - RefreshingTitle: 刷新中標題

    ///   - completionHandle: 回調(配置刷新需要做的事)當header刷新時調用

    /// - Returns: 返回MJRefreshNormalHeader,如需要特殊配置時可接收使用.

    @discardableResult func xh_MJRefreshHeader(IdleTitle:String,WillRefreshTitle:String,RefreshingTitle:String,completionHandle:@escaping MJRefreshComponentRefreshingBlock) -> MJRefreshNormalHeader {

        let header = MJRefreshNormalHeader.init(refreshingBlock: completionHandle)

        self.mj_header = header

        UITableView.xh_MJRefreshHeader(header: header!)

        header?.setTitle(IdleTitle, for: .idle)

        header?.setTitle(WillRefreshTitle, for: .willRefresh)

        header?.setTitle(RefreshingTitle, for: .refreshing)

        return header!

    }

    

    //MARK:---- footer ----

    

    /// footer全局配置

    ///

    /// - Parameter footer: mj_footer

    private class func xh_MJRefreshFooterSetup(footer:MJRefreshBackNormalFooter) {

        footer.isAutomaticallyChangeAlpha = true // 設置自動切換透明度(在導航欄下面自動隱藏)

    }

    

    /// mjfooter刷新

    ///

    /// - Parameter completionHandle: 回調(配置刷新需要做的事)當footer刷新時調用

    /// - Returns: 返回MJRefreshBackNormalFooter,如需要特殊配置時可接收使用.

    @discardableResult func xh_MJRefreshFooter(completionHandle:@escaping MJRefreshComponentRefreshingBlock) -> MJRefreshBackNormalFooter {

        let footer = MJRefreshBackNormalFooter.init(refreshingBlock: completionHandle)

        self.mj_footer = footer

        UITableView.xh_MJRefreshFooterSetup(footer: footer!)

        return footer!

    }

    

    /// mjfooter刷新

    ///

    /// - Parameters:

    ///   - IdleTitle: 空閑狀態標題

    ///   - WillRefreshTitle: 即將刷新(拖動時)標題

    ///   - RefreshingTitle: 刷新中標題

    ///   - completionHandle: 回調(配置刷新需要做的事)當footer刷新時調用

    /// - Returns: 返回MJRefreshBackNormalFooter,如需要特殊配置時可接收使用.

    @discardableResult func xh_MJRefreshFooter(IdleTitle:String,WillRefreshTitle:String,RefreshingTitle:String,completionHandle:@escaping MJRefreshComponentRefreshingBlock) -> MJRefreshBackNormalFooter {

        // 使用 MJRefreshAutoNormalFooter 中的 triggerAutomaticallyRefreshPercent 可以控制刷新高度

        let footer = MJRefreshBackNormalFooter.init(refreshingBlock: completionHandle)

        self.mj_footer = footer

        UITableView.xh_MJRefreshFooterSetup(footer: footer!)

        footer?.setTitle(IdleTitle, for: .idle)

        footer?.setTitle(WillRefreshTitle, for: .willRefresh)

        footer?.setTitle(RefreshingTitle, for: .refreshing)

        return footer!

    }

    

    

    //MARK:---- other ----

    

    /// 停止MJ刷新(header 和 footer都停止) 會自動刷新表格數據.一定要放在數據處理完后調用,否則不出現數據 要自動刷新表格數據的調這個.

    func xh_endMJRefresh() {

        if self.mj_header?.isRefreshing == true {

            self.mj_header.endRefreshing { self.reloadData() }

        } else if self.mj_footer?.isRefreshing == true {

            self.mj_footer.endRefreshing { self.reloadData() }

        } else { self.reloadData() }// 第一次進入頁面拉取數據時.可能header和footer都沒有.所以在這里刷新一下數據

    }

    

    /// 停止MJ刷新(header 和 footer都停止) 需要在回調中處理數據的調這個

    ///

    /// - Parameter completion: 完成回調

    func xh_endMJRefresh(completion:@escaping () -> Void) {

        if self.mj_header?.isRefreshing == true {

            self.mj_header.endRefreshing { completion() }

        } else if self.mj_footer?.isRefreshing == true {

            self.mj_footer.endRefreshing { completion() }

        } else { completion() }

    }

 

 

    /// 開始MJHeader刷新

    func xh_beginMJHeaderRefresh() {

        self.mj_header.beginRefreshing()

    }

    

    /// 開始MJFooter刷新

    func xh_BeginMJFooterRefresh() {

        self.mj_footer.beginRefreshing()

    }

    

    /// 停止MJFooter刷新,並設置為沒有更多數據

    func xh_endMJFooterRefreshWithNoMoreData() {

        self.mj_footer.endRefreshingWithNoMoreData()

    }

    

}

 

**********************************分隔****************************************

 

使用例子:

    

      tableView?.xh_MJRefreshHeader {// 配置mjHeader .footer配置略

            weakSelf?.dosomething()

        }

 

結束刷新:

    //在刷新前要做好數據處理.刷新功能中已經寫了讓表格數據刷新

    self.infoList += list// 先把數據處理好.

    tableView?.xh_endMJRefresh()// 最后停止動畫.會在動畫結束后自動刷新數據.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM