iOS開發之 監聽事件全攻略(一)協議代理= 2016年才開始沒幾天,IT業界大事件快播庭審,最近兩天看了快播庭審,真是精彩,王欣辯護人金嘴真是絕了,話說快播辯護人的金嘴,句句金腔,我很贊同辯護人道出當今互聯網業界的一些不合規矩或者不合法律的一些互聯網公司打的擦邊球,拉下幾家知名互聯網公司陪斬,.....
iOS開發之--監聽事件全攻略(一)協議代理
2016年才開始沒幾天,IT業界大事件快播庭審,最近兩天看了快播庭審,真是精彩,王欣辯護人金嘴真是絕了,話說快播辯護人的金嘴,句句金腔,我很贊同辯護人道出當今互聯網業界的一些不合規矩或者不合法律的一些互聯網公司打的擦邊球,拉下幾家知名互聯網公司陪斬,我很贊同辯護人說的事實,但是快播沒罪麽?快播有罪!快播看毛片的事實不假,毫無疑問,當年快播可能是萬千宅男電腦必備吧!政府的法律法規總是會有滯後性,很多互聯網公司靠著新興科技行業的相關法律或者法規不完整的情況下打擦邊球,也不假,筆者前一段時間在做網站開發,購買了一個全球功能變數名稱,也不知道“某度”是從哪裡獲得我的個人信息,三天兩天的打電話問我的網站是否要推廣,我就納悶叻?我的個人的一些詳細信息,而且是是詳細信息為什麼會被“某度”知道叻?當今的互聯網公司一直在打擦邊球,真希望政府對於新興行業,科技行業能出台一些相關有利於管理的法律法規。
寫博寫博,我希望能幫助更多學習編程的新人們進入IT行業,當今生活在一個互聯網全盛的時代,很多志同道合的朋友們希望進入IT界,希望鄙人的博客能幫助到您一點一點的進步吧,下麵都是個人在iOS開發中一點一點小小的總結吧,正式開始正文吧!
在iOS開發中,監聽一個事件的發生或者變化,常見的有四種。
目錄
1、addTarget註冊事件
2、代理協議
3、通知機制
4、KVO
一、addTarget註冊事件
繼承與UIControl的控制項都可以用addTarget來註冊一個事件,可以在API的UIControl.h的源文中查找到如下方法:
// add target/action for particular event. you can call this multiple times and you can specify multiple target/actions for a particular event.
// passing in nil as the target goes up the responder chain. The action may optionally include the sender and the event in that order
// the action cannot be NULL. Note that the target is not retained.
(void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
好不好看療效,現在看代碼,看效果
*查API可以看出任何繼承於UIControl的控制項都擁有addTarget的方法,使用addTarget註冊事件的代碼如下:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIButton * button = [[UIButton alloc] initWithFrame:CGRectMake(50, 50, 50, 50)];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[button setTitle:@"點擊" forState:UIControlStateNormal];
[button addTarget:self action:@selector(didClickButton) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
-(void)didClickButton{
NSLog(@"%s",__FUNCTION__);
}
代碼中調用了一個方法:
addTarget:(nullable id) action:(nonnull SEL) forControlEvents:(UIControlEvents)
第一個參數Target是指被監聽的目標對象,哪個對象發出的事件,就監聽哪個對象
第二個參數action是指監聽其對象中的方法一般用@selector()查詢其方法,方法在目標對象中去查找。
第三個參數forControlEvents是指動作,哪個動作觸發了事件。
這是開發中最常用監聽事件的方法addTarget,只要繼承於UIControl的類都可以調用addTarget方法,那麼不是繼承於UIControl的類,監聽事件我們一般用協議代理
___
二、協議代理
1、協議
1)協議的含義:協議是一系列方法聲明的列表。
聲明的方法可以被任何遵守其協議的類實現,協議里的方法,都是聲名,沒有實現,沒有屬性。
2)協議里的關鍵字
@required 必須實現,不實現有警告(預設)
@optional 可選實現
3)幾個小小的提示註意點:
基協議:@protocol NSObject,所有的自定義協議都必須直接或間接遵守這個基協議.
2、代理
1)代理的含義:找一個代理對象去幫你做事情(是操作另一個對象)。
2)代理的作用:(都是一些官方的術語,看看就好,開發中按照一般常用設計思路做下去都不會出什麼大的問題)
a 降低耦合
代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了中介的作用和保護了目標對象的作用。
b 提高擴展性
真實的角色就是實現實際的業務邏輯,不用關心其他非本職責的事務,通過後期的代理完成一件完成事務.
3、協議代理在iOS開發中實際的應用
在iOS開發中,協議代理的應用步驟大致分為三步
第一步:定義協議
一般在類的上面用關鍵字@protoco來聲明一個協議,例如:
@protocol XxxDelegate<NSObject>
一般在開發中很多時候協議已經寫好了,不需要自己定義一個協議,只需要遵守協議和實現協議的代理方法就可以。
第二步:定義一個delegete屬性
在其內部定義一個代理屬性,一般書寫的方式例如:
@property(nonatomic,strong)id<XxxDelegate> delegate;
第三步:觸發代理方法
觸發代理方法也就是觸發協議中定義的方法
一般的書寫格式如下
//判斷代理是否成功遵守協議
if( [self.delegate respondsToSelector:@selector(協議方法) ] ){
[self.delegate 協議方法]
}
Tip:如果是自定義協議,需要自己書寫上面三個步驟,如果是遵守了系統的某個協議,只需要做下麵三步就好
第四步:遵守協議
一個類遵守一個協議,在其類名後面添加:<協議名> eg:
@interface 類名 <XxxDelegate>
第五步:設置代理對象
使其內部的delegate屬性指向需要遵守協議的對象,eg:
制定協議的對象.delegate = self
第六步:實現協議裡面的方法
我之前在網上查閱了關於oc協議代理的一些文章,看過很多知名博主寫關於協議代理這點時,最喜歡用的方法是嬰兒保姆,嬰兒找代理,保姆作為代理,還有收快遞,買汽水等等協議代理的案例,筆者覺得用OC的知識闡述協議代理的知識並不是很客觀,因為嬰兒保姆的案例從開發的邏輯上來說是不可能出現這樣的代理方式,所以筆者不再舉這樣的代理案例。下麵會繼續更新協議代理的案例,用UI的案例來舉例協議代理。
**轉載請註明來自吃飯睡覺擼碼的博客 http://www.cnblogs.com/Erma-king/,並包含相關鏈接。**
1月24日更新:(代理協議數據逆傳案例)
下麵用一個小小案例來舉例說明代理,其中涉及到的其他相關的知識點,筆者不一一詳細贅述。
需求:在B界面textField中輸入內容,再點擊B界面的ChangeButton使A界面的Label中的文字變為在B界面textField中輸入的內容
先看看storyboard中的內容
本案例涉及到值的傳遞,而且在多控制器navigationController堆棧和壓棧的問題,筆者不一一贅述,數據逆傳,在開發中處處可見,我想這個案例能夠說明一些代理的問題,還是按照上文的步驟一步一步來實現代理協議
說在前面的話和筆者本人對代理協議的思考與個人看法
B控制器想改變A控制器中的label,B辦不到,所以找代理A,B找代理,協議由B來制定,我看過很多博客或者文章講述代理協議的知識,都用這樣的思考方式去寫協議,找代理,其實,我們可以從另外一個角度去思考這個問題。
筆者本人對協議代理的思考與看法,這個案例中,B控制器點擊了一個Button,要使得A控制器中的Label改變值,可是B控制器不能直接操控A控制器中的Label,但是A控制器可以在內部執行一個方法操控自身的Label,那麼執行這個方法是什麼方法叻?B點擊了一個按鈕,A執行了一個方法,好,這個方法就是協議方法,代理協議是用於監聽事件,什麼是監聽事件,監聽事件本質是監聽方法的調用,但系統調用或則手動調用,不管任何途徑調用了一個方法時,那麼協議方法執行,怎麼才能辦到協議方法在監聽到一個方法被調用的時候,協議方法就會被執行叻?好,現在就引入了代理,也就是delegate屬性,用delegate屬性指向,或者被指向的對象調用協議方法,這樣,就可以實現協議對象執行了一個方法,代理對象執行協議的,這。。。就是監聽。。
上面一段話純屬筆者個人思考和見解,有不同之處歡迎討論,因為筆者認為嬰兒保姆,代收快遞等等案例對協議代理的思考邏輯並不是很符合,所以小小的發表了一些個人思考的方式和看法。
進入實現功能的正題:
第一步:定義協議
在B控制器中制定協議
@class ERTestB;
@protocol ERTestBDelegate <NSObject>
-(void)didClickChangeButton : (ERTestB *) ERTestBView withStr : (NSString *) str;
@end
第二步:定義一個delegete屬性
@interface ERTestB : UIViewController
@property (nonatomic,weak) id <ERTestBDelegate> delegate;
@end
第三步:觸發代理方法
點擊Button後出發代理方法
- (IBAction)didClickChangeButton:(UIButton *)sender {
if ([self.delegate respondsToSelector:@selector(didClickChangeButton:withStr:)]) {
[self.delegate didClickChangeButton:self withStr:self.textFieldString.text];
}
}
第四步:遵守協議
@interface ERTestA () <ERTestBDelegate>
@property (weak, nonatomic) IBOutlet UILabel *labelStr;
@end
第五步:設置代理對象
跳轉之前執行的方法,在跳轉之前設置代理對象
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
ERTestB * testBVC = segue.destinationViewController;
testBVC.delegate = self;
}
第六步:實現協議裡面的方法
-(void)didClickChangeButton : (ERTestB *) ERTestBView withStr : (NSString *) str{
self.labelStr.text = str;
}
測試執行的圖片:
執行成功後的圖片:
OK,協議代理筆者的一些研究和看法就寫到這裡吧,這算是我個人的一些思考方式吧,也算是我的開發筆記,希望幫助組到更多的正在努力路上的朋友門。。
**轉載請註明來自吃飯睡覺擼碼的博客 http://www.cnblogs.com/Erma-king/,並包含相關鏈接。**