delegate

什么是 delegate

delegate是委托模式.委托模式是將一件屬于委托者做的事情,交給另外一個被委托者來處理.

一個標準的委托由以下部分組成:

協議的聲明

我們需要用協議來申明哪些方法是被委托出去了.

@protocolMyUIViewDelegate- (void)func;@end

委托者申明一個屬性

委托者里得有一個屬性代表被委托者, 注意這個屬性是弱引用.

@interfaceMyUIView:UIView@property(nonatomic,weak)id delegate;

被委托者聲明實現了協議

被委托者需要聲明自己實現了委托里的協議.

@interfaceMyUIViewController:UIViewController@end

設置委托

在被委托者里設置自己是委托者的被委托者.嘛,這句話是有些繞.

// viewcontroller. m中- (id)init{? ? MyUIView *myView = [[MyUIView alloc] init];//對MyUIView進行初始化myView.delegate=self;// 將MyUIViewController自己的實例作為委托對象self.view= myView; }

委托事件

在委托者里調用委托的方法.

// MyUIView.m中- (void)doSomething{? ? [self.delegatefunc];? }

delegate的用途

委托一般可以分成3種

傳遞事件

傳遞事件就是A發生了什么事情, 希望B知道下, 然后B在自己的類里面要做出某些反應.典型的如

tableView:didSelectRowAtIndexPath:, 就是UITableView點擊了某個cell的時候, 希望其它類(通常是ViewController)響應這個點擊, 在點擊的時候跳轉到其他viewController之類的.

確定事件可執行

確定事件可執行是當A需要執行某個事件的時候, A不確定到底可執行, 這個時候希望B能回應下. 如tableView:shouldHighlightRowAtIndexPath:是UITableView詢問其它類要不要高亮顯示某個cell, 當返回NO的時候, 就UITableView就不會執行cell的高亮方法.

傳遞值

傳遞值是當A需要某個數據的時候, 由B來提供. 例子還是UITableView里的,tableView:cellForRowAtIndexPath:是需要某個cell的時候由其他類提供這個cell.

委托命名

委托

通常的委托用delegate做后綴.如

@protocol<#class#>Delegate

數據源

當你的委托的方法過多, 可以拆分數據部分和其他邏輯部分, 數據部分用dataSource做后綴. 如

@protocol<#class#>DataSource

方法修飾

委托的方法不是百分百必須實現的.

必須實現的方法

用required修飾的方法是必須實現的.協議默認聲明在其中的方法為必須實現的方法.

@protocolMyProtocol@required- (void)func;@end// 用的時候- (void)doSomething{? ? [_delegate <#func2#>];}

可以實現的方法

用optional修飾的方法可以不實現. 在用到的時候需要先判斷方法是否存在

@protocolMyProtocol@optional- (void)func;@end// 用的時候- (void)doSomething{if(_delegate respondsToSelector:@selector(<#func2#>)){? ? ? ? [_delegate <#func2#>];}}

方法命名

當特定的事件發生時, 對象會觸發它注冊的委托方法.

委托的方法, 第一個參數是觸發它的對象,第一個關鍵詞是觸發對象的類名, 錯誤的狀態必須帶有error信息, 其他的參數看實際情況. 根據委托方法觸發的時機和目的, 使用should,will,did等關鍵詞.更具事件的狀態, 使用finish, fail, start等關鍵詞.

-(BOOL)tableView:(NSTableView*)tableView shouldSelectRow:(int)row;

完成

finish表示一個事件已經完成, 通常情況下我們默認是成功.

- (void)<#class#>DidFinish<#event#>:(id)class

失敗

fail表示一個事件已經失敗了, 我們在這里需要返回錯誤的原因.

-(void)<#class#>:(id)classdidFail<#event#>:(NSError*)error

開始

start標志一個事件的開始.

- (void)<#class#>DidStart<#event#>:(id)clas

將要開始

should表示某事件將要開始.同意開始則返回YES, 否則返回NO

-(BOOL)<#class#>ShouldStart<#event#>:(id)class

1

多播委托

通常的委托只支持一對一的委托, 但是在某些場景下, 我們希望有多個被委托者. 這種場景下可以考慮使用多播委托.

多播委托的實現類在XYMulticastDelegate,https://github.com/uxyheaven/XYQuick/tree/master/XYQuick/event/modules.

他是copy form XMPP的GCDMulticastDelegate.

每個多播委托的委托者類建議有以下的基本描述

// .h// 多播委托, 建議加上你的協議修飾: -(id )multicastDelggate;- (id)multicastDelggate;- (void)addDelegate:(id)delegate;- (void)removeDelegate:(id)delegate;- (void)removeAllDelegates;


實現文件里, 你需要這么寫

// .m- (void)addDelegate:(id)delegate{? ? [_multicastDelggate addDelegate:delegatedelegateQueue:dispatch_get_main_queue()];}- (void)removeDelegate:(id)delegate{? ? [_multicastDelggate removeDelegate:delegate];}- (void)removeAllDelegates{? ? [_multicastDelggate removeAllDelegates];}


delegate掛鉤

父類實現部分協議, 子類實現部分協議.

詳情見

http://blog.csdn.net/uxyheaven/article/details/44261831

參考文檔

http://www.lxweimin.com/p/b6434c2997d1

http://leopard168.blog.163.com/blog/static/168471844201306114533858/

https://github.com/robbiehanson/XMPPFramework

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容