iOS 輕松實(shí)現(xiàn)頁面無數(shù)據(jù)、無網(wǎng)絡(luò)、請求出錯的友好提示

本文主要是講講自己在項(xiàng)目中基于 MJRefresh 封裝的一套當(dāng)頁面出現(xiàn)異常情況時給出友好提示頁面 YYLrefresh 的實(shí)現(xiàn)思路。
Github下載地址: YYLrefresh

實(shí)現(xiàn)思路

  1. 采用低侵入式的 category來實(shí)現(xiàn)。
    • category不需要通過增加子類而增加現(xiàn)有類的行為(方法), 且類目中的方法與原始類方法基本沒有區(qū)別。
    • 通過 category 可以將龐大一個類的方法進(jìn)行劃分,從而便于代碼的日后的維護(hù)、更新以及提高代碼的閱讀性。
  2. 采用插座式的設(shè)計(jì)無數(shù)據(jù)、無網(wǎng)絡(luò)、請求出錯頁面方便產(chǎn)品的個性化需求,并且提供默認(rèn)實(shí)現(xiàn)。

具體實(shí)現(xiàn)

代碼目錄.png

下面先來看具體實(shí)現(xiàn)的頭文件UIScrollView+Refresh.h

  1. 首先定義一個枚舉用來區(qū)分當(dāng)前頁面的類型
typedef enum : NSUInteger {
    YYLLoadErrorTypeDefalt,
    YYLLoadErrorTypeNoNetwork,      //沒有網(wǎng)絡(luò)
    YYLLoadErrorTypeRequest,        //請求接口 后臺報錯
    YYLLoadErrorTypeNoData,         //當(dāng)前頁面沒有數(shù)據(jù)
} RELoadErrorType;
  1. 下面定義的屬性,主要是用來決定用 UIScrollView、UITableView...及其子類實(shí)現(xiàn)的頁面是否顯示下拉刷新,上啦加載功能及其回調(diào) Block。
/**
 *  是否顯示表格的頭部刷新
 */
@property(nonatomic, assign) BOOL isShowHeaderRefresh;

/**
 *  是否顯示表格的尾部刷新
 */
@property(nonatomic, assign) BOOL isShowFooterRefresh;


/**
 *  表格頭部刷新調(diào)用的Block
 */
@property(nonatomic, copy) RERefreshTableViewRefreshingBlock headerRefreshingBlock;

/**
 *  表格尾部刷新調(diào)用的Block
 */
@property(nonatomic, copy) RERefreshTableViewRefreshingBlock footerRefreshingBlock;
  1. 下面屬性主要是用來設(shè)置頁面顯示的類型
/**
 *  設(shè)置頁面顯示的類型
 */
@property(nonatomic, assign) RELoadErrorType loadErrorType;

/**
 *  數(shù)據(jù)是否全部加載完
 */
@property(nonatomic, assign) BOOL isDataLoaded;

/**
 是否第一次加載
 */
@property(nonatomic, assign) BOOL isFirstLoading;

/**
 *  停止刷新
 */
- (void)endRefreshing;
  1. 下面是默認(rèn)的無數(shù)據(jù)、無網(wǎng)絡(luò)、請求出錯頁面提示,可以根據(jù)產(chǎn)品的需求替換成自己實(shí)現(xiàn)的 View。 具體使用見項(xiàng)目中的 Demo 實(shí)現(xiàn)。
/**
 *  沒有網(wǎng)絡(luò)時顯示的視圖
 */
@property(nonatomic, strong) UIView *refreshNoNetworkView;

/**
 *  訪問出錯時顯示的視圖
 */
@property(nonatomic, strong) UIView *refreshRequestErrorView;

/**
 *  沒有數(shù)據(jù)顯示的視圖
 */
@property(nonatomic, strong) UIView *refreshNoDataView;

/**
 *  錯誤視圖的tableview容器
 */
@property(nonatomic, strong) UITableView *refreshErrorTableView;

UIScrollView+Refresh.m 具體實(shí)現(xiàn)代碼的詳解:
.m 文件主要是重寫 .h文件中的各個屬性的 get 和 set 方法, 然后借助 objc_setAssociatedObject將屬性關(guān)聯(lián)上對象。具體實(shí)現(xiàn)這里就不一一解釋了。主要來看一下下面這個核心的方法實(shí)現(xiàn):

- (void)setLoadErrorType:(YYLLoadErrorType)loadErrorType {
    if (self.refreshNoNetworkView.superview) [self.refreshNoNetworkView removeFromSuperview];
    if (self.refreshRequestErrorView.superview) [self.refreshRequestErrorView removeFromSuperview];
    if (self.refreshNoDataView.superview) [self.refreshNoDataView removeFromSuperview];
    if (loadErrorType == YYLLoadErrorTypeNoNetwork) {
        self.isShowFooterRefresh = NO;
        [self addSubview:self.refreshNoNetworkView];
        [self.refreshNoNetworkView mas_remakeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(0);
            make.width.mas_equalTo(self.mas_width);
            make.top.mas_equalTo(0);
            make.height.mas_equalTo(self.mas_height);
        }];
        
    } else if (loadErrorType == YYLLoadErrorTypeRequest) {
        self.isShowFooterRefresh = NO;
        [self addSubview:self.refreshRequestErrorView];
        [self.refreshRequestErrorView mas_remakeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(0);
            make.width.mas_equalTo(self.mas_width);
            make.top.mas_equalTo(0);
            make.height.mas_equalTo(self.mas_height);
        }];
    } else if (loadErrorType == YYLLoadErrorTypeNoData) {
        self.isShowFooterRefresh = NO;
        [self addSubview:self.refreshNoDataView];
        [self.refreshNoDataView mas_remakeConstraints:^(MASConstraintMaker *make) {
            make.left.mas_equalTo(0);
            make.width.mas_equalTo(self.mas_width);
            make.top.mas_equalTo(0);
            make.height.mas_equalTo(self.mas_height);
        }];
    }
    objc_setAssociatedObject(self, &loadErrorTypeKey, @(loadErrorType), OBJC_ASSOCIATION_ASSIGN);
    [self endRefreshing];
}

這個方法主要是通過用戶設(shè)置的類型 loadErrorType 來決定該怎樣顯示頁面: 具體實(shí)現(xiàn)是將原來的頁面上顯示的輔助視圖移除掉,根據(jù)類型顯示新的視圖。新視圖的位置大小與頁面相同。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 每到畢業(yè)季,總會接到很多學(xué)弟學(xué)妹關(guān)于未來的困惑,在讀研和工作中質(zhì)疑著自己的選擇。已經(jīng)踏入工作崗位的總會懷...
    名夏有余音閱讀 339評論 1 1
  • 看完白鹿原,居然久久不能睡著,一個個人物鮮活地出現(xiàn)在我的腦海里。白嘉軒,他固執(zhí),封建,但是他的擔(dān)當(dāng),寬容,耿直,還...
    愛微笑的娜子閱讀 375評論 2 1
  • 以前我一直認(rèn)為自己是個善于發(fā)現(xiàn)缺點(diǎn)和改正缺點(diǎn)的人。那樣過了好多年之后竟有了一個荒唐的觀點(diǎn):覺得自己是個沒有什么缺點(diǎn)...
    A有翅膀的貓閱讀 1,707評論 3 5
  • 假裝像個成熟人一樣,冷靜的生活,不應(yīng)放飛自我,最后唱首離歌。
    莞爾聽風(fēng)閱讀 142評論 0 2

友情鏈接更多精彩內(nèi)容