iOS 网络请求失败View封装

原创 2017年01月03日 15:35:39

封装一个NoData的View方便在网络请求失败时调用

1新建一个继承UIView的类:XSNoDataView

头文件里

#import <UIKit/UIKit.h>
typedef void (^ButtonBlock) (id sender);
@interface XSNoDataView : UIView

- (void)addButtonAction:(ButtonBlock)block;
@end

m文件里

#import "XSNoDataView.h"
#define ScreenWidth  [UIScreen mainScreen].bounds.size.width
#define ScreenHeight  [UIScreen mainScreen].bounds.size.height

@interface XSNoDataView ()

@property (nonatomic, strong, nullable) ButtonBlock block;
@property (nonatomic, strong, nullable) UIButton *button;

@end

@implementation XSNoDataView

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/
- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        
        UIImageView *imageView = [[UIImageView alloc] init];
        imageView.frame = CGRectMake(ScreenWidth*3/8, adoptValue(240), ScreenWidth / 4, ScreenWidth / 4);
        [self addSubview:imageView];
        
        NSMutableArray *imgArray = [NSMutableArray array];
        for (int i=0; i<3; i++) {
            UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"netError%d.png",i]];
            [imgArray addObject:image];
        }
        imageView.animationImages = imgArray;
        imageView.animationDuration = 6*0.15;
        imageView.animationRepeatCount = 0;
        [imageView startAnimating];
        
        
        UILabel *label = [[UILabel alloc] init];
        label.frame = CGRectMake(0, imageView.frame.origin.y+20+ScreenWidth/4, ScreenWidth, 30);
        label.textColor = [UIColor lightGrayColor];
        label.text = @"亲,您的手机网络不太顺畅喔~";
        label.textAlignment = NSTextAlignmentCenter;
        label.numberOfLines = 0;
        [self addSubview:label];
        
        UIButton *refreshBTN = [UIButton buttonWithType:UIButtonTypeCustom];
        [refreshBTN setTitle:@"重新加载" forState:UIControlStateNormal];
        [refreshBTN setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal];
        refreshBTN.titleLabel.font = [UIFont systemFontOfSize:14];
        refreshBTN.layer.masksToBounds = YES;
        refreshBTN.layer.borderWidth = 1;
        refreshBTN.layer.cornerRadius = 3;
        refreshBTN.layer.borderColor = [UIColor lightGrayColor].CGColor;
        refreshBTN.frame = CGRectMake(ScreenWidth/2-50, label.frame.origin.y+60, 100, 30);
        [self addSubview:refreshBTN];
        [refreshBTN addTarget:self action:@selector(buttonAction) forControlEvents:(UIControlEventTouchUpInside)];

    }
    return self;
}

//实现block回调的方法
- (void)addButtonAction:(ButtonBlock)block {
    self.block = block;
}
- (void)buttonAction {
    if (self.block) {
        self.block(self);
    }
}
@end

2 在需要的UIViewController里导入这个类

在网络请求失败的方法里调用,block里就是点击刷新(重试)走的方法,如下:

@property (nonatomic, strong, nullable) XSNoDataView *baseView;

        if (self.baseView) {
            self.baseView.hidden = NO;
        }else{
            self.baseView = [[XSNoDataView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight)];
            self.baseView.backgroundColor = [UIColor whiteColor];
            // self.baseView.frame = self.view.frame;
            [self.view addSubview:self.baseView];
            @weakify(self)//弱引用
            [self.baseView addButtonAction:^(id sender) {
                @strongify(self)
                self.baseView.hidden = YES;
                [self loadData];
            }];
            
        }



版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS-UIWebview设置超时、加载失败、重新加载等问题解决

iOS开发 UIWebView加载失败 我想重新加载怎么做,使用reload不顶用 解决办法:重新使用loadRequest:设置超时 NSURL *url=[NSURL URLWithS...
  • ws1352864983
  • ws1352864983
  • 2017年07月25日 14:25
  • 2038

LoadingView解决首次页面刷新状态(请求中,无数据,失败)

引言1.我们在日常开发中经常会遇到数据加载需要网络请求的场景,我们通常的做法是用系统提供的ProgressDialog组件 (显示等待进度的dialog) 但是会有一个不友好的地方(假如网络出异常了,...
  • qinwei1993
  • qinwei1993
  • 2016年03月15日 16:42
  • 2776

ios实现加载框

//  jiazai=[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewS...
  • shb2058
  • shb2058
  • 2016年09月20日 17:31
  • 192

仿iOS的网络请求的加载框

/** * 发送请求后的加载框 *  * @param myView * @param msg */ public void showPopupWindow(View myView, St...
  • chenhucxc
  • chenhucxc
  • 2016年04月13日 14:51
  • 287

iOS 封装加载、提示窗progressHUD —— HERO博客

封装了一个加载动画、提示信息弹窗HWProgressHUD,使用简单,方便修改。
  • hero_wqb
  • hero_wqb
  • 2017年04月21日 18:02
  • 772

iOS9 中的网络请求适配(http请求的允许)

新特性要求App内访问的网络必须使用HTTPS协议。 但是现在公司的项目使用的是HTTP协议,使用私有加密方式保证数据安全。  方法如下: 在Info.plist中添加NSAppTran...
  • June_email
  • June_email
  • 2015年12月23日 14:53
  • 2923

iOS9 HTTP网络请求不成功的解决方案

今天升级Xcode 7.0 bata发现网络访问失败。 输出错误信息 The resource could not be loaded because the App Transport Secu...
  • LeaderQiu
  • LeaderQiu
  • 2016年03月08日 09:37
  • 2439

无网或断网提示,自定义界面(UIView分类,使用方便)

由于项目中需要添加无网或者断网条件下的提示界面,所以就简单的写了一个提示的界面.记得之前在一份源码中见过类似的场景,但是忘了是哪一个了,也没有找到.因为项目中多数界面都使用到这个无网提示界面,包含控制...
  • hu9134
  • hu9134
  • 2016年05月11日 16:08
  • 1955

iOS10 网络请求异常

[] nw_socket_set_common_sockopts setsockopt SO_NOAPNFALLBK failed: [42] Protocol not available, dump...
  • u012265444
  • u012265444
  • 2016年11月07日 16:48
  • 2864

iOS9.0 网络请求错误解决

错误描述: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is ins...
  • luoshengkim
  • luoshengkim
  • 2015年07月30日 14:38
  • 1267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS 网络请求失败View封装
举报原因:
原因补充:

(最多只允许输入30个字)