前言
在ios開發中,常見的幾種逆向傳值方式,有代理(delegate)、通知(nsnotification),block等等,本文就給大家分析下,如何理解和快速上手代理模式,并以一個簡單的逆向傳值為案例,看看代理模式是不是很難。
一、代理模式中的幾個概念
講代理模式之前,首先需要弄清楚兩個概念:被代理對象和代理對象。并且需要知道它們之間是靠協議關連起來的。
1、被代理對象
被代理對象往往就是真正有做事意圖的那個對象,比如賣房子案例中的想賣房子的房主,保姆嬰兒案例中想喝奶的嬰兒。但是它們自己做不到,只能借助于房產中介和保姆。
2、代理對象
代理對象就是真正辦事的對象,如上面提到的幫賣房子的中介和照顧嬰兒的保姆。
3、協議
代理對象必須有一個規范才能成為代理,比如說只有持證的才能成為房產中介,房主才敢把房子交給他代理,只有家政服務的保姆才敢讓她過來照顧嬰兒,不可能讓保姆去賣房子,讓中介照顧嬰兒。而這個規范就是協議,這個協議誰定的?答案肯定是被代理對象。
二、代理模式的書寫規范
弄清楚基本概念以后,接下來就是書寫代理模式,很多同學不知道怎么下手,其實這也是有跡可循的。
被代理對象
1、定義協議,在協議中定義方法用于傳值,傳什么類型的值就設置什么類型的參數
2、聲明一個遵守上述協議的delegate屬性
3、在需要傳值的時候調用代理對象完成傳值
代理對象
1、遵守被代理對象定義的協議
2、實現協議中的方法,捕獲傳過來的值,并根據需求來處理捕獲的值
設置被代理對象的delegate屬性為代理對象
這一步是在上述兩個對象的其中一個里面完成的
三、代理模式與逆向傳值
通過如上描述可以看出,其實代理模式只是一種解決特定問題的方法,它有自己的使用場景,比如a想監聽b的一些變化,a無法自己處理某些事情等。俗話說no code, no bb,下面舉一個實際案例:現在有兩個界面,如圖1和圖2所示,界面很簡單,不再贅述,主要是在第一個界面點擊跳轉按鈕,到達第二個界面,然后第二界面在輸入框中輸入信息后點擊返回按鈕,第一個界面中的uilabel能顯示第二個界面輸入的內容,這是最簡單的一個逆向傳值。
四、實現步驟
分析: 現在是第二個界面想傳值,但是自己做不了,所以它是被代理對象,第一個界面自然就是代理對象。然后根據上面的規范寫代碼。
1、被代理對象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
//.h 文件 //被代理對象 做以下幾件事 //1、創建一個協議,用于傳值 //2、聲明一個遵守上述協議的delegate屬性 /** * 創建協議,里面有一個方法,帶一個參數,該參數就是我想傳出去的值 */ @protocol passvalue <nsobject> -( void )passedvalue:(nsstring *)inputvalue; @end @interface nextviewcontroller : uiviewcontroller /** * 聲明一個delegate屬性 */ @property(nonatomic, weak) id<passvalue> delegate; @end ================================================================= //.m 文件 #import "nextviewcontroller.h" @interface nextviewcontroller () @property (weak, nonatomic) iboutlet uitextfield *inputtext; - (ibaction)back:(id)sender; @end @implementation nextviewcontroller - ( void )viewdidload { [super viewdidload]; self.navigationitem.title = @ "第二個界面" ; } /** * 返回上一個界面 * * @param sender <#sender description#> */ - (ibaction)back:(id)sender { nsstring *inputstring = self.inputtext.text; //3、調用代理對象完成傳值 if (self.delegate && [self.delegate respondstoselector:@selector(passedvalue:)]){ [self.delegate passedvalue:inputstring]; } [self.navigationcontroller popviewcontrolleranimated:yes]; } @end |
2、代理對象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
//.h 文件 #import <uikit/uikit.h> #import "nextviewcontroller.h" //代理對象 //實現被代理對象創建的協議,實現其中的方法,捕獲傳過來的值 @interface viewcontroller : uiviewcontroller <passvalue> @end ================================================================= //.m 文件 #import "viewcontroller.h" @interface viewcontroller () @property (weak, nonatomic) iboutlet uilabel *nextpassedvalue; - (ibaction)next:(id)sender; @end @implementation viewcontroller - ( void )viewdidload { [super viewdidload]; } /** * 實現被代理對象的方法,將捕獲的值設置到uilabel中 * * @param inputvalue 傳過來的值 */ -( void )passedvalue:(nsstring *)inputvalue{ self.nextpassedvalue.text = inputvalue; } //點擊返回按鈕跳轉到第二個界面 - (ibaction)next:(id)sender { nextviewcontroller *nvc = [[nextviewcontroller alloc]init]; //設置被代理對象的delegate屬性為代理對象即self nvc.delegate = self; [self.navigationcontroller pushviewcontroller:nvc animated:yes]; } @end |
五、實現效果
總結
以上就是這篇文章的全部內容了,希望本文的內容對各位ios開發者們能有所幫助,如果有疑問大家可以留言交流。
原文鏈接:http://www.jianshu.com/p/6005a38c4487