在使用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ā)生了什么事