代理設(shè)計(jì)模式

使用tableHeaderView和tableFooterView實(shí)現(xiàn)頭廣告輪播及尾部加載更多數(shù)據(jù)中我們是使用通知的方式來使Controller類和子控件進(jìn)行交互的。這種方式對(duì)于封裝來講不是很好,因?yàn)樵贑ontroller類中還需要知道子控件發(fā)出通知的key以便監(jiān)聽子控件發(fā)出的通知,如果不看子控件的源碼是無法知道的。所以這篇使用代理設(shè)計(jì)模式來實(shí)現(xiàn)交互。

代理設(shè)計(jì)模式簡(jiǎn)介

  • 代理設(shè)計(jì)模式的作用
    • A對(duì)象監(jiān)聽B對(duì)象的一些行為,A成為B的代理
    • B對(duì)象想告訴A對(duì)象一些事情,A成為B的代理
  • 代理設(shè)計(jì)模式的總結(jié)
    • 如果你想監(jiān)聽別人的一些行為,那么你就要成為別人的代理
    • 如果你想告訴別人一些事情,那么就讓別人成為你的代理
  • 代理設(shè)計(jì)模式的實(shí)現(xiàn)步驟
    • 1.制定協(xié)議(協(xié)議名字的格式:控件名+Delegate),在協(xié)議里面聲明一些代理方法(一般代理方法都是@optional(非必須實(shí)現(xiàn)的))

      /**
       *  WXLoadMoreFooterDelegate
       */
      @protocol WXLoadMoreFooterDelegate <NSObject>
      
      @optional
      /**
       *  加載更多按鈕點(diǎn)擊后發(fā)生
       */
      -(void)loadMoreFooterDidClickLoadMoreButton:(WXLoadMoreFooter *)footer;
      @end
      
    • 2.聲明一個(gè)代理屬性:@property(nonatomic,weak) id<代理協(xié)議> delegate;

      • 注意要使用weak,避免強(qiáng)引用循環(huán)
      /** delegate */
      @property (nonatomic,weak) id<WXLoadMoreFooterDelegate> delegate;
      
    • 3.在內(nèi)部發(fā)生某些行為時(shí),調(diào)用代理對(duì)應(yīng)的代理方法,通知代理內(nèi)部發(fā)生什么事情

      - (IBAction)loadMore:(id)sender {
      self.loadMoreButton.hidden = YES;
      self.loadingMoreView.hidden = NO;
      
        //注意判斷代理實(shí)現(xiàn)類是否實(shí)現(xiàn)了方法
        if([self.delegate respondsToSelector:@selector(loadMoreFooterDidClickLoadMoreButton:)])
        {
            [self.delegate loadMoreFooterDidClickLoadMoreButton:self];
        }
      }
      
    • 4.設(shè)置代理: xxx.delegate = yyy;

      WXLoadMoreFooter *footer = [WXLoadMoreFooter LoadMoreFooter];
      footer.delegate = self;
    
    • 5.yyy對(duì)象遵守協(xié)議,實(shí)現(xiàn)代理方法。
    
      -(void)loadMoreFooterDidClickLoadMoreButton:(WXLoadMoreFooter *)footer{
          [self loadMoreDeals];
      }
    
      - (void)loadMoreDeals{
          dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
              WXData *deal = [[WXData alloc]init];
    
              deal.icon = @"2c97690e72365e38e3e2a95b934b8dd2";
              deal.title = @"xxxx";
              deal.price =[NSString stringWithFormat:@"%d",arc4random_uniform(1000)];
              deal.buyCount = @"90";
              [self.list addObject:deal];
    
              // 刷新表格
              [self.tableView reloadData];
    
              WXLoadMoreFooter *footer = (WXLoadMoreFooter *)self.tableView.tableFooterView;
              [footer endLoading];
          });
      }
    

代理和通知的區(qū)別

  • 代理:一個(gè)對(duì)象只能告訴另一個(gè)對(duì)象發(fā)生了什么事
  • 通知:一個(gè)對(duì)象可以告訴N個(gè)對(duì)象發(fā)生了什么事

源碼下載

最后編輯于
?著作權(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)容