需求
在沒有網(wǎng)絡(luò)的情況下离福,點(diǎn)擊進(jìn)行頁(yè)面跳轉(zhuǎn)的按鈕垦藏,提示“無(wú)網(wǎng)絡(luò)連接”。
思考
滿足需求實(shí)現(xiàn)功能很簡(jiǎn)單颈畸,在按鈕的點(diǎn)擊事件中去判斷網(wǎng)絡(luò)狀態(tài)乌奇。可如果給每個(gè)按鈕都去加的話工作量有點(diǎn)大眯娱,并且全都是重復(fù)的代碼礁苗。
如何才能一次性給所有按鈕的點(diǎn)擊事件添加上判斷網(wǎng)絡(luò)狀態(tài)的代碼呢?(當(dāng)然給所有按鈕添加判斷網(wǎng)絡(luò)狀態(tài)的代碼也并不完全合理徙缴,有的按鈕點(diǎn)擊事件并不需要網(wǎng)絡(luò)试伙,暫且先不管,只是思考怎么攔截所有按鈕的點(diǎn)擊事件)
聯(lián)想
之前項(xiàng)目中也實(shí)現(xiàn)過類似的功能于样。如:防數(shù)組越界中攔截?cái)?shù)組的objectAtIndex:方法疏叨,為所有VC添加統(tǒng)計(jì)代碼的時(shí)候攔截所有VC的viewWillAppear:方法和viewWillDisappear:方法。那么就按照這樣的思路去攔截所有按鈕的點(diǎn)擊事件穿剖。
實(shí)現(xiàn)
為UIButton添加一個(gè)分類蚤蔓,分類中將按鈕點(diǎn)擊事件進(jìn)行替換,在替換的方法中判斷網(wǎng)絡(luò)狀態(tài)糊余,如果無(wú)網(wǎng)絡(luò)連接進(jìn)行提示秀又,如果網(wǎng)絡(luò)正常,正常走按鈕的點(diǎn)擊事件啄刹。
核心代碼
+ (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{
// 有問題 有時(shí)只打印出“走了...”
NSLog(@"%@ 走了...", target);
AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager manager];
[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
if (status == AFNetworkReachabilityStatusNotReachable || status == AFNetworkReachabilityStatusUnknown) {
NSLog(@"無(wú)網(wǎng)絡(luò)連接....");
return ;
}else{ // 如果有網(wǎng)絡(luò)繼續(xù)走系統(tǒng)方法
[self custom_sendAction:action to:target forEvent:event];
}
}];
[manager startMonitoring];
}
重點(diǎn)
替換按鈕的點(diǎn)擊方式是:- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event該方法
demo地址:***https://gitee.com/liangsenliangsen/intercept_button_click_events
****本篇文章到這里就結(jié)束了涮坐,愿大家加班不多工資多,男同胞都有女朋友誓军,女同胞都有男朋友袱讹。??***