IOS學習可以先從基礎(chǔ)開始,以后會介紹寫內(nèi)容吧
為回民等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及回民網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站建設(shè)、做網(wǎng)站、回民網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
這篇文章想跟大家分享的主旨是iOS捕獲用戶事件的各種情況,以及內(nèi)部封裝的一些特殊事件。
我們先從UIButton談起,UIButton大家使用的太多了,他特殊的地方就在于其內(nèi)置的普通Default/高亮Highlighted/選擇Selected/可用Enable的幾個狀態(tài)(UIControlState)。其次就是SDK內(nèi)部已經(jīng)為我們封裝了以下用戶事件:
那么他看起來并不像N叉樹,但是不代表者不是一顆N叉樹,當我們項目復雜之后,這個View可不可以有多個UIButton節(jié)點?所以他就是一棵樹。
實際上我們要把這棵樹寫完整,應(yīng)該還要算上UIButton的UILabel和UIImageView,因為他們也是UIReponder的子類。這里先不考慮了。
我們對UIButton來講,他此時若是葉節(jié)點,那么這時我們針對他所在的響應(yīng)鏈來說,他在他之前的響應(yīng)者就應(yīng)該是我們controller的view(樹中的葉節(jié)點比父節(jié)點永遠更優(yōu)先被分發(fā)事件,但是并不是說他就能在時間上先響應(yīng),我們下面講為什么)。所以我們嘗試在任意地方打印這個Button的nextReponder對象。nextResponder對象是UIReponder類的實例方法,它會返回任意對象在樹中的上一個響應(yīng)者實例:
NSLog(@"%@",_testButton.nextResponder);
NSLog(@"%@",_testButton.nextResponder);
2013-09-2103:40:25.989響應(yīng)鏈[614:60b]<UIView:0x16555e10;frame=(00;320568);autoresize=RM+BM;layer=<CALayer:0x16555e70>>
我們可以根據(jù)這個UIView的尺寸來得知,他就是我們唯一的控制器中的那個UIView。
接下來我們再打印下這個UIView的下一個響應(yīng)者是誰:
NSLog(@"%@",_testButton.nextResponder.nextResponder);
NSLog(@"%@",_testButton.nextResponder.nextResponder);
2013-09-2103:45:03.914響應(yīng)鏈[621:60b]<RSViewController:0x15da0e30>
依次看,接著加一個nextResponder:
2013-09-2103:50:49.428響應(yīng)鏈[669:60b](null)
為什么這里ViewController沒有父親呢?注意這句代碼我是寫在ViewDidLoad中,而我們知道這個方法的生命周期比較早,所以我們換個地方寫或者延遲一段時間再打印,兩種方法都可以得到結(jié)果(由此可以推理出我們響應(yīng)者樹的構(gòu)造過程是在ViewDidLoad周期中來完成的,這個函數(shù)會將當前實例的構(gòu)成的響應(yīng)者子樹合并到我們整個根樹中):
2013-09-2103:53:47.304響應(yīng)鏈[681:60b]<UIWindow:0x14e24200;frame=(00;320568);gestureRecognizers=<NSArray:0x14e242e0>;layer=<UIWindowLayer:0x14e244a0>>
再繼續(xù)往上追朔:doubledelayInSeconds=2.0;
dispatch_time_tpopTime=dispatch_time(DISPATCH_TIME_NOW,(int64_t)(delayInSeconds*NSEC_PER_SEC));
dispatch_after(popTime,dispatch_get_main_queue(),^(void){
NSLog(@"%@",_testButton.nextResponder.nextResponder.nextResponder.nextResponder);
});
double delayInSeconds = 2.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ NSLog(@"%@",_testButton.nextResponder.nextResponder.nextResponder.nextResponder); });
2013-09-2103:56:22.043響應(yīng)鏈[690:60b]<UIApplication:0x15659c00>
再加一個:2013-09-2103:56:51.186響應(yīng)鏈[696:60b]<RSAppDelegate:0x16663520>
那么我們的appDelegate還有沒有父節(jié)點?2013-09-2103:57:22.588響應(yīng)鏈[706:60b](null)
沒有了,注意,一個從葉節(jié)點開始分發(fā)的事件,最多也就只能分發(fā)到我們的AppDelegate了!這個樹形結(jié)構(gòu)在我們的項目中尤為重要,舉個栗子,如果我們想在一個view中重寫UITouchEvent的4個方法,并且不影響他的父視圖也響應(yīng)這些事件,就要注意你重寫的方式了,比如我們在ViewController中重寫touchBegan如下:
-(void)touchesBegan:(NSSet*)toucheswithEvent:(UIEvent*)event
{
NSLog(@"ViewController接收到觸摸事件");
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"ViewController接收到觸摸事件"); }
-(void)touchesBegan:(NSSet*)toucheswithEvent:(UIEvent*)event
{
NSLog(@"appDelegate接收到觸摸事件");
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@"appDelegate接收到觸摸事件"); }
那么究竟是誰被觸發(fā)呢?
2013-09-2104:02:49.405響應(yīng)鏈[743:60b]ViewController接收到觸摸事件
這個很好理解,我剛剛也說了,viewController明顯是appDelegate的子節(jié)點,他有事件分發(fā)的優(yōu)先權(quán)。如果我們想兩個地方都觸發(fā)呢?這里super一下就可以了:-(void)touchesBegan:(NSSet*)toucheswithEvent:(UIEvent*)event
{
[supertouchesBegan:toucheswithEvent:event];
NSLog(@"ViewController接收到觸摸事件");
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [super touchesBegan:touches withEvent:event]; NSLog(@"ViewController接收到觸摸事件"); }輸出:
2013-09-2104:07:26.206響應(yīng)鏈[749:60b]appDelegate接收到觸摸事件
2013-09-2104:07:26.208響應(yīng)鏈[749:60b]ViewController接收到觸摸事件
注意看時間戳,appDelegate雖然優(yōu)先級別不如ViewController,但是他響應(yīng)的時間上面足足比ViewController早了0.002秒,我這里試了幾次,都是相差0.002秒。那么我們分析一下這里的響應(yīng)者鏈是怎樣工作的:
用戶手指觸摸到了UIView上,由于我們沒有重寫UIView的UITouchEvent,所以他里面和super執(zhí)行的一樣的,將該事件繼續(xù)分發(fā)到UIViewController;
UIViewController的TouchBegan被我們重寫了,如果我們不super,那么我們在這里寫響應(yīng)代碼。事件到這里就不繼續(xù)分發(fā)了??上攵琔IViewController祖先節(jié)點:UIWindow,UIApplication,AppDelegate都無權(quán)被分發(fā)此事件。
如果我們super了TouchBegan,那么此次觸摸事件由
ViewController分發(fā)給UIWindow,
UIWindow繼而分發(fā)給UIApplication,
UIApplication再分發(fā)給AppDelegate,
于是我們在ViewController和appDelegate的touchBegan方法中都捕獲到了這次事件。
到這里大家應(yīng)該對這個響應(yīng)者樹有一個很好的理解了吧?
接下來我們再談?wù)劦谝豁憫?yīng)者,和UIButton上的事件分發(fā)。
文章題目:ios開發(fā)
標題路徑:http://muchs.cn/article6/gcidig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊、標簽優(yōu)化、App設(shè)計、服務(wù)器托管、營銷型網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)