標籤:
代理模式通常用於解決類似這樣的問題:我們通過介面A開啟了介面B,但在應用進行的過程中,介面B有時候也需要和A主動聯絡,比如點擊某個按鈕時。一個比較好的辦法是,讓A成為B的代理,這樣B就可以在需要的時候給A發送訊息了。
代理模式的一個好處是,B實際上不需要瞭解A的任何事情,只要知道A是自己的代理就可以了。在這種模式下,B依然獨立與A,實現了松耦合。
對象A是對象B的代理,對象B需要向A發送訊息,設定方法分四步:
1、在對象B的.h中定義一個protocol代理協議,並聲明一個協議的屬性變數
2、讓對象B在適當的時候向代理對象A發送訊息,比如觸發按鈕時。
3、讓對象A遵從代理協議
4、通知對象B,現在A是它的代理
分步說明:
1、在B.h中定義代理協議和屬性變數
1 /*****B.h*****/ 2 3 @protocol BDelegate<NSObject> 4 5 - (void) degegateMethod:(instanceType)instance; 6 7 @end 8 9 @interface B10 11 @property(weak,nonatomic) id<BDelegate> delegate;12 13 @end
2、在B.m中實現B向A發送訊息的方法,以按下done按鈕為例:
1 /*****B.m******/ 2 3 #import "B.h" 4 5 @interface B() 6 7 @end 8 9 @implementation B10 11 - (IBAction)done:(id)sender{12 [self.delegate delegateMethod:instance];13 }14 15 @end
3、讓A遵從代理協議,在A.h的@interface聲明中增添一個角括弧即可
1 /*****A.h*****/2 3 @interface A<BDelegate>4 5 @end
4、通知對象B,A已經成為它的代理。在A.m中實現代理方法即可
1 /*****A.m*****/ 2 3 #import "A.h" 4 5 @interface A() 6 7 @end 8 9 @implementation A10 11 - (void)delegateIdentifierMethod:(B *)b{12 //do something;13 B.delegate=self; //identify the delegate of B is A14 }15 16 - (void)delegateMethod:(instanceType)instance{17 //do something18 }19 20 @end
需要注意的是,在B.h中聲明的代理方法delegateMethod需要在A.m中實現,否則會報錯。
iOS代理模式設定方法