封裝全局的無網絡界面

時間匆忙, 隨便簡單寫了個demo提交到github了:https://github.com/FrankSunDragon/NONetwork

現(xiàn)在的APP都注重用戶的體驗, 所以主流的APP都有無數(shù)據(jù)界面和無網絡界面的顯示來提醒用戶。有一種簡單的做法能實現(xiàn)上面那種需求,就是在每個控制器判斷是否有網絡,沒有的話就加在無網絡界面;但臃腫的代碼顯示不是我們這些程序猿的喜愛。
經過上網搜尋資料后, 理清了實現(xiàn)的基本思路:
** 1、給UIViewController添加類別(分類),添加無網絡界面控件并成為無網絡數(shù)據(jù)界面的代理方法和移除控件方法;
2、基于某網絡請求框架封裝的工具類中,傳入目標控制器;
3、網絡請求時,在工具類中判斷是否有網絡,并實現(xiàn)相應的方法。**

1、網絡請求工具類

我是基于afnetworking框架寫的工具類,主要是封裝了簽名認證和無網絡返回block的處理,而加載無網絡界面需要傳入目標控制器。

   // 判斷是否加載網絡界面的普通的GET請求
 + (void)ZMG_Internet_general_getWithTarget:(nonnull UIViewController*)target  modelArr:(NSArray *)modelArr  url:(NSString *)url   params:(NSDictionary *)params   success:(void (^)(id json))success failure:(void (^)(NSError *error))failure connect:(void(^)(BOOL internet))IsAvailable; 

這個方法里target參數(shù)是目標控制器;
modelArr就是判斷現(xiàn)在控制器所在的view有沒有數(shù)據(jù),有數(shù)據(jù)沒有網絡就彈出一個HUD,沒數(shù)據(jù)沒有網絡的情況下,才像是無網絡界面。
IsAvailable參數(shù)就是回調的block,yes為有網絡,no為無網絡;

+ (void)ZMG_Internet_general_getWithTarget:(nonnull UIViewController*)target  modelArr:(NSArray *)modelArr  url:(NSString *)url   params:(NSDictionary *)params   success:(void (^)(id json))success failure:(void (^)(NSError *error))failure connect:(void(^)(BOOL internet))IsAvailable{
//1. 檢測網絡
BOOL  intenet = [GlobalVariables isExistenceNetwork];
if(IsAvailable){
    IsAvailable(intenet);
}
if(intenet == NO){// 沒有網絡
    if(modelArr.count>0)  return;// 如果已有數(shù)據(jù),然后沒有網絡
    
    [target showNotInternetView];
    
}else{  // 有網絡
    // 打印請求的路徑和參數(shù)
    [target hiddenNotInternetView];
    
    NSString* str = @"";
    for (NSString *key in params) {
        NSString* str2 = [[NSString alloc] initWithFormat:@"%@=%@&", key,params[key] ];
        str = [str stringByAppendingString:str2];
    }
    //  NSLog(@"%@?%@\n%@",url,str,params);
    
    // 2.創(chuàng)建請求管理者
    AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
       mgr.requestSerializer.timeoutInterval = TIMEOUTINTERVAL;
    // 3.發(fā)送請求
    [mgr GET:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        if (success) {
            success(responseObject);
        }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        if (failure) {
            failure(error);
        }
    }];

}

}

2、 UIViewController+FDNotNetController分類

- (void)showNotInternetView
{
NSInteger tag = 0;
for (UIView* view in self.view.subviews) {
    if ([view isKindOfClass:[FDNotInternetView class]]) {
        tag++;
    }
}
if(tag>0)
    return;
CGFloat YY = 64;
if([self isKindOfClass:[FDBaseTableViewController class]]){
    YY = 0;
}

FDNotInternetView  * view = [[FDNotInternetView alloc] initWithFrame:CGRectMake(0, YY, SYFWidth, SYFHeight-YY)];
view.delegate = self;

[self.view addSubview:view];
}
- (void)hiddenNotInternetView
{
for (UIView* view in self.view.subviews) {
    if ([view isKindOfClass:[FDNotInternetView class]]) {
        [view removeFromSuperview];
    }
}
}
  //無網絡控件的代理方法
- (void) reloadNetworkRequest:(id)sender
{
if ([self respondsToSelector:@selector(reloadRequest)]) {
    [self performSelector:@selector(reloadRequest)];
}
}

1、自定義無網絡控件

#import <UIKit/UIKit.h>
@protocol FDNotInternetViewDelegate  <NSObject>
- (void)reloadNetworkRequest:(id)sender;
@end
@interface FDNotInternetView : UIView
/**
 *  由代理控制器去執(zhí)行刷新網絡
 */
@property (nonatomic, weak) id<FDNotInternetViewDelegate>delegate;
@end

在FDNotInternetView.m文件里,點擊重新加載的實現(xiàn)方法:
- (void)reloadNetworkDataSourcer:(id)sender {
if (self.delegate && [self.delegate respondsToSelector:@selector(reloadNetworkRequest:)]) {
[self.delegate performSelector:@selector(reloadNetworkRequest:) withObject:sender];
}
}

最關鍵的一步: 要在控制器里面寫reloadRequest方法,來實現(xiàn)重新加載;



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

相關閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,765評論 25 709
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,044評論 4 61
  • 原文鏈接:https://github.com/opendigg/awesome-github-android-u...
    IM魂影閱讀 33,143評論 6 472
  • 1、看到這個問題我的第一反應是到底選擇讓誰上車,真的很難取舍。文中最后的答案讓人眼前一亮(我怎么就沒想到呢?),橫...
    青墨QINGMO閱讀 151評論 0 1

友情鏈接更多精彩內容