美文网首页
iOS开发——无网占位图的实现

iOS开发——无网占位图的实现

作者: 06f43b0b52f7 | 来源:发表于2017-09-27 10:19 被阅读142次

    http://www.jianshu.com/p/d537393fe247

    详细讲解:

    首先按照设计师的UI图封装一个无网占位图view:CQNoNetworkView,在构造方法里完成

    • (instancetype)initWithFrame:(CGRect)frame{
      if (self = [super initWithFrame:frame]) {
      // UI搭建
      [self setUpUI];
      }
      return self;
      }
      /** UI搭建 */

      • (void)setUpUI{
        self.backgroundColor = [UIColor whiteColor];

        // 404图片放中间
        UIImageView *noNetworkImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 125, 125)];
        noNetworkImageView.center = CGPointMake(self.width / 2, self.height / 2);
        [self addSubview:noNetworkImageView];
        noNetworkImageView.image = [UIImage imageNamed:@"404notfound"];

        // 重新查看按钮
        UIButton *checkButton = [[UIButton alloc]initWithFrame:CGRectMake(0, noNetworkImageView.maxY + 24, 115, 30)];
        checkButton.centerX = self.width / 2;
        [self addSubview:checkButton];
        [checkButton.titleLabel setFont:[UIFont systemFontOfSize:15]];
        checkButton.backgroundColor = [UIColor colorWithRed:0.00 green:0.76 blue:0.66 alpha:1.00];
        [checkButton setTitle:@"重新查看" forState:UIControlStateNormal];
        [checkButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        [checkButton addTarget:self action:@selector(checkNetworkButtonClicked) forControlEvents:UIControlEventTouchUpInside];

        // 图片上面的两个label
        UILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 20)];
        label1.text = @"刷新一下返回店铺!";
        label1.font = [UIFont systemFontOfSize:14];
        label1.textColor = [UIColor colorWithRed:0.00 green:0.77 blue:0.68 alpha:1.00];
        label1.backgroundColor = [UIColor clearColor];
        label1.textAlignment = NSTextAlignmentCenter;
        [label1 sizeToFit];
        label1.centerX = self.width / 2;
        label1.maxY = noNetworkImageView.y - 21;
        [self addSubview:label1];

        UILabel label2 = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 15)];
        label2.text = @"您似乎迷路了";
        label2.font = [UIFont systemFontOfSize:19];
        label2.textColor = [UIColor colorWithRed:0.00 green:0.77 blue:0.67 alpha:1.00];
        label2.backgroundColor = [UIColor clearColor];
        label2.textAlignment = NSTextAlignmentCenter;
        [label2 sizeToFit];
        label2.centerX = self.width / 2;
        label2.maxY = label1.y - 12;
        [self addSubview:label2];
        }
        处理“重新查看”按钮的逻辑,基本思路是:点击此按钮时,判断是否有网,如果仍旧没网,弹出toast提示用户;如果有网,移除此view,并且,让代理方执行相应代理方法,比如说,重新加载数据。
        /
        * 重新查看按钮点击 */

      • (void)checkNetworkButtonClicked{
        if ([DateUtil isNetWorkRunning]) {
        // 如果有网,view消失,并且让代理方执行代理方法
        for (CQNoNetworkView *view in [self getCurrentViewController].view.subviews) {
        if ([view isMemberOfClass:[CQNoNetworkView class]]) {
        [view removeFromSuperview];
        }
        }

        // 重新加载数据
        if ([self.delegate respondsToSelector:@selector(reloadData)]) {
            [self.delegate reloadData];
        }
        

        }else{
        // 如果没网,toast提示
        [CQHud showToastWithMessage:@"请检查你的网络连接"];
        }
        }
        确定代理方法(点击“重新加载”按钮时,代理方执行的方法),我的是重新加载数据。
        @protocol CheckNetworkDelegate <NSObject>
        @optional

      /** 重新加载数据 */

      • (void)reloadData;

    @end

    /** 无网络时展示的view */
    @interface CQNoNetworkView : UIView

    @property (nonatomic,weak) id<CheckNetworkDelegate> delegate;

    @end
    确定代理方。代理方就是执行“重新加载数据”的对象。由于每个viewController都需要在无网时展示无网占位图,所以代理方可以设置为项目的BaseViewController(不要告诉我,你的项目里没有基类😅)
    @interface BaseViewController ()<CheckNetworkDelegate>
    在基类里实现重新加载数据,当然,需要由子类重写,不过如果你的项目架构的比较好,所有viewcontroller的获取数据的方法的方法名都一样,那么就不需要再由子类重写了:

    /** 重新加载数据,由子类重写 */
    (void)reloadData{

    }
    同样在基类里实现弹出无网占位图的方法:

    /** 显示无网络view */

    • (void)showNoNetworkView{
      // 将导航栏和tabbar留出来
      CQNoNetworkView *noNetworkView = [[CQNoNetworkView alloc]initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight - 49)];
      noNetworkView.delegate = self;
      [self.view addSubview:noNetworkView];
      }
      在基类的viewWillAppear:里判断网络情况:
      // 如果没网,加载无网占位图
      if (![DateUtil isNetWorkRunning]) {
      // 无网加载无网站位图
      [self showNoNetworkView];
      }else{
      // 有网移除所有无网展位图
      for (CQNoNetworkView *view in self.view.subviews) {
      if ([view isMemberOfClass:[CQNoNetworkView class]]) {
      [view removeFromSuperview];
      }
      }
      }
      最后,在你的子类里重写“重新加载数据”方法即可:
    • (void)reloadData{
      [self getData];
      }
      总结

    此功能主要是代理和基类的运用,合理使用基类能让你少些很多代码。当然有些APP可能不仅有一种网络占位图,这个时候在子类里重写基类里的showNoNetworkView方法即可。以上是我对此功能的一些个人看法,只是简单的实现了这个功能,具体项目中还是要根据项目需求进行必要修改和优化的。但是,思路基本上不变。欢迎各位看官提出意见或建议。

    作者:无夜之星辰
    链接:http://www.jianshu.com/p/d537393fe247
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:iOS开发——无网占位图的实现

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