美文网首页
无网络或者信号差的情况下界面UI

无网络或者信号差的情况下界面UI

作者: 为零sowill | 来源:发表于2017-02-06 11:40 被阅读59次

    首先:先决条件是所有控制器继承自BaseController

    其次:这里判断网络状态用了Reachability,可以pod下来 或者github上下载

    下面是具体实现:
    新建一个view命名为QDXNoNetWorkView,继承自UIView 由于View上有按钮点击事件 所以需要设置一个代理。
    这里是.h文件

    @protocol CheckNetworkDelegate <NSObject>
    @optional
    
    /** 重新加载数据 */
    - (void)reloadData;
    
    @end
    
    @interface QDXNoNetWorkView : UIView
    
    @property (nonatomic,weak) id<CheckNetworkDelegate> delegate;
    
    @end
    

    这里有一个点 就是代理要用weak 和闭包一样是循环引用的问题

    下面是.m文件的实现

    - (instancetype)initWithFrame:(CGRect)frame
    {
        if (self = [super initWithFrame:frame])
        {
            // UI搭建
            [self setUpUI];
        }
        return self;
    }
    
    - (void)setUpUI
    {
      //省略
      [noNetWorkButton addTarget:self action:@selector(checkNetworkButtonClicked) forControlEvents:UIControlEventTouchUpInside];
    }
    
    /** 重新查看按钮点击 */
    - (void)checkNetworkButtonClicked{
        if ([self isNetWorkRunning]) {
            // 如果有网,view消失,并且让代理方执行代理方法
            for (QDXNoNetWorkView *view in [self getCurrentViewController].view.subviews) {
                if ([view isMemberOfClass:[QDXNoNetWorkView class]]) {
                    [view removeFromSuperview];
                }
            }
            
            // 重新加载数据
            if ([self.delegate respondsToSelector:@selector(reloadData)]) {
                [self.delegate reloadData];
            }
        }else{
            // 如果没网,toast提示
            [MBProgressHUD showError:@"请检查你的网络连接"];
        }
    }
    
    - (BOOL)isNetWorkRunning{
        BOOL isExistenceNetwork=YES;
        Reachability *r = [Reachability reachabilityWithHostName:@"www.qudingxiang.cn"];//auto-view.cn/iphone
        switch ([r currentReachabilityStatus]) {
            case NotReachable:
                isExistenceNetwork=NO;
                break;
            case ReachableViaWWAN:
                //使用3G/GPRS网络
                isExistenceNetwork=YES;
                break;
            case ReachableViaWiFi:
                //使用WiFi网络
                isExistenceNetwork=YES;
                break;
        }
        return isExistenceNetwork;
    }
    
    /** 获取当前View的控制器对象 */
    -(UIViewController *)getCurrentViewController{
        UIResponder *next = [self nextResponder];
        do {
            if ([next isKindOfClass:[UIViewController class]]) {
                return (UIViewController *)next;
            }
            next = [next nextResponder];
        } while (next != nil);
        return nil;
    }
    

    下面是在BaseViewController中的使用

    第一:告诉控制器我要实现这个代理
    第二:在头文件中放出reloadData 加载不同网络请求

    #import "QDXNoNetWorkView.h"
    
    @interface BaseViewController : UIViewController<CheckNetworkDelegate>
    
    - (void)reloadData;
    @end
    

    建立观察者模式 监听网络改变

    #import "SGNetObserver.h"
    
    @property (nonatomic,strong) SGNetObserver *observer;
    
    self.observer = [SGNetObserver defultObsever];
        [self.observer startNotifier];
        
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStatusChanged:) name:SGReachabilityChangedNotification object:nil];
    
    - (void)dealloc{
        [[NSNotificationCenter defaultCenter] removeObserver:self name:SGReachabilityChangedNotification object:nil];
    }
    
    - (void)networkStatusChanged:(NSNotification *)notify{
    //    NSLog(@"notify-------%@",notify.userInfo[@"status"]);
    
        if ([notify.userInfo[@"status"] intValue] == 0) {
            [self showNoNetworkView];
        }else{
            // 有网移除所有无网展位图
            for (QDXNoNetWorkView *view in self.view.subviews) {
                if ([view isMemberOfClass:[QDXNoNetWorkView class]]) {
                    [view removeFromSuperview];
                }
            }
        }
    }
    
    -(void)reloadData
    {
        
    }
    
    /** 显示无网络view */
    - (void)showNoNetworkView{
        // 将导航栏和tabbar留出来
        QDXNoNetWorkView *noNetworkView = [[QDXNoNetWorkView alloc]initWithFrame:CGRectMake(0, 0, QdxWidth, QdxHeight - 49)];
        noNetworkView.delegate = self;
        [self.view addSubview:noNetworkView];
    }
    

    相关文章

      网友评论

          本文标题:无网络或者信号差的情况下界面UI

          本文链接:https://www.haomeiwen.com/subject/oxwyittx.html