delegate

什么是 delegate

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

一個(gè)標(biāo)準(zhǔn)的委托由以下部分組成:

協(xié)議的聲明

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

@protocolMyUIViewDelegate- (void)func;@end

委托者申明一個(gè)屬性

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

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

被委托者聲明實(shí)現(xiàn)了協(xié)議

被委托者需要聲明自己實(shí)現(xiàn)了委托里的協(xié)議.

@interfaceMyUIViewController:UIViewController@end

設(shè)置委托

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

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

委托事件

在委托者里調(diào)用委托的方法.

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

delegate的用途

委托一般可以分成3種

傳遞事件

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

tableView:didSelectRowAtIndexPath:, 就是UITableView點(diǎn)擊了某個(gè)cell的時(shí)候, 希望其它類(通常是ViewController)響應(yīng)這個(gè)點(diǎn)擊, 在點(diǎn)擊的時(shí)候跳轉(zhuǎn)到其他viewController之類的.

確定事件可執(zhí)行

確定事件可執(zhí)行是當(dāng)A需要執(zhí)行某個(gè)事件的時(shí)候, A不確定到底可執(zhí)行, 這個(gè)時(shí)候希望B能回應(yīng)下. 如tableView:shouldHighlightRowAtIndexPath:是UITableView詢問其它類要不要高亮顯示某個(gè)cell, 當(dāng)返回NO的時(shí)候, 就UITableView就不會(huì)執(zhí)行cell的高亮方法.

傳遞值

傳遞值是當(dāng)A需要某個(gè)數(shù)據(jù)的時(shí)候, 由B來提供. 例子還是UITableView里的,tableView:cellForRowAtIndexPath:是需要某個(gè)cell的時(shí)候由其他類提供這個(gè)cell.

委托命名

委托

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

@protocol<#class#>Delegate

數(shù)據(jù)源

當(dāng)你的委托的方法過多, 可以拆分?jǐn)?shù)據(jù)部分和其他邏輯部分, 數(shù)據(jù)部分用dataSource做后綴. 如

@protocol<#class#>DataSource

方法修飾

委托的方法不是百分百必須實(shí)現(xiàn)的.

必須實(shí)現(xiàn)的方法

用required修飾的方法是必須實(shí)現(xiàn)的.協(xié)議默認(rèn)聲明在其中的方法為必須實(shí)現(xiàn)的方法.

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

可以實(shí)現(xiàn)的方法

用optional修飾的方法可以不實(shí)現(xiàn). 在用到的時(shí)候需要先判斷方法是否存在

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

方法命名

當(dāng)特定的事件發(fā)生時(shí), 對(duì)象會(huì)觸發(fā)它注冊(cè)的委托方法.

委托的方法, 第一個(gè)參數(shù)是觸發(fā)它的對(duì)象,第一個(gè)關(guān)鍵詞是觸發(fā)對(duì)象的類名, 錯(cuò)誤的狀態(tài)必須帶有error信息, 其他的參數(shù)看實(shí)際情況. 根據(jù)委托方法觸發(fā)的時(shí)機(jī)和目的, 使用should,will,did等關(guān)鍵詞.更具事件的狀態(tài), 使用finish, fail, start等關(guān)鍵詞.

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

完成

finish表示一個(gè)事件已經(jīng)完成, 通常情況下我們默認(rèn)是成功.

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

失敗

fail表示一個(gè)事件已經(jīng)失敗了, 我們?cè)谶@里需要返回錯(cuò)誤的原因.

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

開始

start標(biāo)志一個(gè)事件的開始.

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

將要開始

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

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

1

多播委托

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

多播委托的實(shí)現(xiàn)類在XYMulticastDelegate,https://github.com/uxyheaven/XYQuick/tree/master/XYQuick/event/modules.

他是copy form XMPP的GCDMulticastDelegate.

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

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


實(shí)現(xiàn)文件里, 你需要這么寫

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


delegate掛鉤

父類實(shí)現(xiàn)部分協(xié)議, 子類實(shí)現(xiàn)部分協(xié)議.

詳情見

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

參考文檔

http://www.itdecent.cn/p/b6434c2997d1

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

https://github.com/robbiehanson/XMPPFramework

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容