iOS开发中拦截项目中所有按钮的点击事件

需求

在没有网络的情况下,点击进行页面跳转的按钮,提示“无网络连接”。

思考

满足需求实现功能很简单,在按钮的点击事件中去判断网络状态。可如果给每个按钮都去加的话工作量有点大,并且全都是重复的代码。
如何才能一次性给所有按钮的点击事件添加上判断网络状态的代码呢?(当然给所有按钮添加判断网络状态的代码也并不完全合理,有的按钮点击事件并不需要网络,暂且先不管,只是思考怎么拦截所有按钮的点击事件)

联想

之前项目中也实现过类似的功能。如:防数组越界中拦截数组的objectAtIndex:方法,为所有VC添加统计代码的时候拦截所有VC的viewWillAppear:方法和viewWillDisappear:方法。那么就按照这样的思路去拦截所有按钮的点击事件。

实现

为UIButton添加一个分类,分类中将按钮点击事件进行替换,在替换的方法中判断网络状态,如果无网络连接进行提示,如果网络正常,正常走按钮的点击事件。

核心代码

  + (void)load{

[super load];

Method oldObjectAtIndex =class_getInstanceMethod([UIButton class],@selector(sendAction:to:forEvent:));
Method newObjectAtIndex =class_getInstanceMethod([UIButton class], @selector(custom_sendAction:to:forEvent:));
method_exchangeImplementations(oldObjectAtIndex, newObjectAtIndex);

}

- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event{
[super sendAction:action to:target forEvent:event];
}

- (void)custom_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event{
// 有问题  有时只打印出“走了...”
NSLog(@"%@  走了...", target);
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager manager];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    if (status == AFNetworkReachabilityStatusNotReachable || status == AFNetworkReachabilityStatusUnknown) {
        NSLog(@"无网络连接....");
        return ;
    }else{  // 如果有网络继续走系统方法
        [self custom_sendAction:action to:target forEvent:event];
    }
}];
[manager startMonitoring];

}

重点

替换按钮的点击方式是:- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event该方法

demo地址:***https://gitee.com/liangsenliangsen/intercept_button_click_events

****本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。***

你可能感兴趣的:(iOS开发中拦截项目中所有按钮的点击事件)