首先:先决条件是所有控制器继承自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];
}
网友评论