代理設計模式

大部分按鈕的監聽都使用代理方式

  • 代理模式的作用
    • 1.A對象監聽B對象的一些行為的時候,A成為B的代理。
    • 2.A對象想告訴B對象的一些事情的時候,B成為A的代理,A中調用[self.delegate 協議規定好的名字]
    • 解耦,兩個控制器之間傳遞值
  • 3.什么時候用呢?
    • 當你想監聽別人的行為的時候,那么你就成為別人的代理,并實現協議中的特定方法。
    • 當你想告訴別人你的一些事情或者傳遞你的一些數據,讓別人幫你完成某些事情的時候,那么就讓別人成為你的代理,在自己.h中聲明一個代理屬性,并在.m的中一些事情的方法里面調用[self.delegate 協議規定好的名字],可以在這個方法里面傳遞你想要傳給代理的數據。
  • 一個項目內兩個對象之間需要溝通,可以通過代理的方式,而最好不要通過發送通知去通知中心。
    • 比如自定義了一個加載更多的xib及繼承了UIView的自定義類,由于連線是在JUXIB.m中,當我需要點擊加載更多時,需要讓控制器去響應這個事件,并去加載數據這個操作。
    • 雖然發通知給通知中心,然后控制器收到通知去操作可以,但是這樣不好。
    • 這個時候引入了代理設計模式。
      • 1.首先定義一個協議,協議里面放需要代理去實現的方法,為什么要協議呢?因為代理的屬性是id類型(不知誰會成為我的代理,而且成為我的代理那個人用什么方法名去幫我實現需要統一),而且在調用代理的方法的時候,需要有統一的名字,達成一致的方法名。


      • 2.協議中方法有兩個狀態,一個是@optional,一個是@require

        • @optional是可選實現,代理類不一定要實現這個方法,所以此時被代理類的.m文件中調用的[self.delegate 協議規定好的名字]必須要做一個判斷, if([self.delegate respondsToSelector:@selector(協議中的方法名)])
        • require是必須實現,代理類一點遵循了這個協議,必須實現這個狀態的方法
      • 3.在需要代理的那個類的.h中定義一個遵循協議的屬性(weak),叫delegate。

      • 4.此時在連線的按鈕的方法里面,調用[self.delegate 協議規定好的名字];,并傳入self
      • 5.這個時候,想要跟這個類溝通的類或監聽這個類內部設置過代理的方法的類需要遵循協議,并成為代理,如下:


      • 6.用了代理模式之后,不用通過通知中心。控制器成功監聽到被代理類內部的方法(按鈕的點擊)或者傳遞數據給任意控制器,而且不論誰都可以成為代理只要遵循協議。

協議的命名規范

  • 當沒有2個以上的參數的時候,要寫類名(除去前綴)+作用的英文:參數。表示誰干了什么。

    • 比如 loadMoreFooterDidClick:(JUloadMoreFooter *)footer;
    • 蘋果自帶的- (void)scrollViewDidZoom:(UIScrollView *)scrollView
  • 當有兩個參數以上的時候,要寫 類名(除去前綴):()參數 對誰:()參數 作用:()參數

    • (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容