iOS 委託代理(delegate)入門
剛接觸iOS開發的朋友肯定對委託這個東西感覺到陌生和迷惑,特別是Java轉過來的(博主中槍),那麼今天我們就簡單的談談委託這個東西,atany會盡量做到說的淺顯易懂的~
首先讓我們來看看委託的定義:委託(delegate),就是某個物件指定另一個物件處理某些特定任務的設計模式。通俗來說,就是“某個物件”把要做的事情委託給“另一個物件”去做,簡單吧。
其中“某個物件”被稱作委託者,“另一個物件”被稱作是被委託者。
【注】:委託者與被委託者的叫法很多,例如(普通物件與委託物件,委託與代理等等)為了方便大家理解,下文統一使用“委託與代理”的叫法。
在委託與代理之間還有一個重要的概念——協議,協議是委託與代理之間的橋樑,把兩者緊密聯絡在一起(關於協議的具體內容,本節不詳細深入)。
二、委託與代理
如下圖,委託方通過某種方式把任務分派出去給代理方處理,而兩者之間的聯絡便是協議。
在程式中:一般情況下
1.委託需要做的工作有:
1.1定義協議與方法
1.2宣告委託變數
1.3設定代理
1.4通過委託變數呼叫委託方法
2.代理需要做的工作有:
2.1遵循協議
2.2實現委託方法
可能現在大家還不明白,我們設定如下場景,把每個工作都帶入程式碼就清楚了
場景:Boss準備舉行一場party,準備邀請Atany來參加party,但是Boss沒空寫email給Atany,於是他委託Henry與Mary來做這件事情。
1) 先看YGViewController.h(根控制器,程式第一個介面,類似於Boss)
- #import <UIKit/UIKit.h>
- @protocol InviteDelegate
- -(void)inviteToMyParty:(NSString *)personName;//1.1定義協議與方法
- @end
-
@interface YGViewController : UIViewController
- @property (assign,nonatomic) id<InviteDelegate> delegate;//1.2宣告委託變數
- - (IBAction)ClickByMary:(id)sender;//委託給Mary
- - (IBAction)ClickByHenry:(id)sender;//委託給Henry
- @end
在YGViewController.h中,委託執行了兩件事情,分別是定義協議與宣告委託。Boss並沒有實現inviteToMyParty這個方法,他沒有自己去邀請。
2) 再看YGViewController.m中ClickByMary與ClickByHenry點選事件
- - (IBAction)ClickByMary:(id)sender {
- Mary *mary = [[Mary alloc]init];
- self.delegate = mary;//1.3設定代理
- [self.delegate inviteToMyParty:@"atany"];//1.4通過委託變數呼叫委託方法
- }
- - (IBAction)ClickByHenry:(id)sender {
- Henry *henry = [[Henry alloc]init];
- self.delegate = henry;//1.3設定代理
- [self.delegate inviteToMyParty:@"atany"];//1.4通過委託變數呼叫委託方法
- }
兩者大同小異,都是例項化物件,然後設定代理,最後呼叫方法。
BOSS可以選擇不同的代理(Henry與Mary)來做這件事情(inviteToMyParty),而自己卻不用做。
3) 以Henry為例子,我們看看Henry.h
- #import <UIKit/UIKit.h>
- #import "YGViewController.h"
- @interface Henry : UIViewController <InviteDelegate>//2.1遵循協議
- @end
Henry遵循協議,隨時準備好接收Boss的召喚。
4) Henry.m中我們實現了inviteToMyParty的具體方法,我們彈出一個對話方塊來顯示邀請內容。
- -(void)inviteToMyParty:(NSString *)personName{
- NSString *hello = [NSString stringWithFormat:@"Hello,%@",personName];
- NSString *str = [NSString stringWithFormat:@"Hey Boy,this is Henry,Come to our party Please!!"];
- UIAlertView *alert = [[UIAlertView alloc]initWithTitle:hello message:str delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
- [alert show];
- }
按照上面步驟便完成一個簡單的協議+委託的程式。
效果圖:
Over:有不懂或者錯誤的地方,歡迎指正。