事件詳情: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()// 最后停止動畫.會在動畫結束后自動刷新數據.