ios代理设计模式
代理设计模式的作用:
1.A对象监听B对象的一些行为,A成为B的代理
2.B对象想告诉A对象一些事情,A成为B的代理
代理设计模式的总结:
如果你想监听别人的一些行为,那么你就要成为别人的代理
如果你想告诉别人一些事情,那么就让别人成为你的代理
代理设计模式的开发步骤
1.拟一份协议(协议名字的格式:控件名 + Delegate),在协议里面声明一些代理方法(一般代理方法都是@optional)
2.声明一个代理属性:@property (nonatomic, weak) id<代理协议> delegate;
3.在内部发生某些行为时,调用代理对应的代理方法,通知代理内部发生什么事
4.设置代理:xxx.delegate = yyy;
5.yyy对象遵守协议,实现代理方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #import <UIKit/UIKit.h> 2 3 @class XMGLoadMoreFooter; 4 5 @protocol XMGLoadMoreFooterDelegate <NSObject> 6 @optional//不写@optional默认为必须实现的代理方法 7 //代理方法一般以类名开头,传入被监听的控件对象 8 - (void)loadMoreFooterDidClickLoadMoreButton:(XMGLoadMoreFooter *)footer; 9 @end 10 11 @interface XMGLoadMoreFooter : UIView 12 + (instancetype)footer; 13 //代理属性用weak修饰,id类型代表任何类都可以作为代理,在<>中指明要实现的协议名称 14 @property (nonatomic, weak) id<XMGLoadMoreFooterDelegate> delegate; 15 16 /** 17 * 结束加载状态 18 */ 19 - (void)endLoading; 20 @end
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // 2 // XMGLoadMoreFooter.m 3 // 06-自定义等高cell01-storyboard 4 // 5 // Created by xiaomage on 15/6/6. 6 // Copyright (c) 2015年 小码哥. All rights reserved. 7 // 8 9 #import "XMGLoadMoreFooter.h" 10 #import "XMGDealsViewController.h" 11 12 @interface XMGLoadMoreFooter() 13 @property (weak, nonatomic) IBOutlet UIButton *loadMoreButton; 14 @property (weak, nonatomic) IBOutlet UIView *loadingMoreView; 15 @end 16 17 @implementation XMGLoadMoreFooter 18 19 + (instancetype)footer 20 { 21 return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject]; 22 } 23 24 /** 25 * 点击了加载更多 26 */ 27 - (IBAction)loadMore { 28 self.loadMoreButton.hidden = YES; 29 self.loadingMoreView.hidden = NO; 30 31 // 告诉代理,非必须实现的代理方法先判断下是否被代理类实现, 32 //在内部发生某些行为时调用代理对应的代理方法,通知代理发生了什么事 33 if ([self.delegate respondsToSelector:@selector(loadMoreFooterDidClickLoadMoreButton:)]) { 34 [self.delegate loadMoreFooterDidClickLoadMoreButton:self]; 35 } 36 } 37 38 /** 39 * 结束加载状态 40 */ 41 - (void)endLoading 42 { 43 self.loadMoreButton.hidden = NO; 44 self.loadingMoreView.hidden = YES; 45 } 46 47 @end
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // 2 // XMGDealsViewController.m 3 // 06-自定义等高cell01-storyboard 4 // 5 // Created by xiaomage on 15/6/2. 6 // Copyright (c) 2015年 小码哥. All rights reserved. 7 // 8 9 #import "XMGDealsViewController.h" 10 #import "XMGDeal.h" 11 #import "XMGDealCell.h" 12 #import "XMGPageView.h" 13 #import "XMGLoadMoreFooter.h" 14 15 @interface XMGDealsViewController () <XMGLoadMoreFooterDelegate> 16 /** 所有的团购数据 */ 17 @property (nonatomic, strong) NSMutableArray *deals; 18 @end 19 20 @implementation XMGDealsViewController 21 22 /** 23 * 代理设计模式的作用: 24 * 1.A对象监听B对象的一些行为,A成为B的代理 25 * 2.B对象想告诉A对象一些事情,A成为B的代理 26 * 27 * 代理设计模式的总结: 28 * 如果你想监听别人的一些行为,那么你就要成为别人的代理 29 * 如果你想告诉别人一些事情,那么就让别人成为你的代理 30 * 31 * 代理设计模式的开发步骤 32 * 1.拟一份协议(协议名字的格式:控件名 + Delegate),在协议里面声明一些代理方法(一般代理方法都是@optional) 33 * 2.声明一个代理属性:@property (nonatomic, weak) id<代理协议> delegate; 34 * 3.在内部发生某些行为时,调用代理对应的代理方法,通知代理内部发生什么事 35 * 4.设置代理:xxx.delegate = yyy; 36 * 5.yyy对象遵守协议,实现代理方法 37 */ 38 39 - (NSMutableArray *)deals 40 { 41 if (_deals == nil) { 42 // 加载plist中的字典数组 43 NSString *path = [[NSBundle mainBundle] pathForResource:@"deals.plist" ofType:nil]; 44 NSArray *dictArray = [NSArray arrayWithContentsOfFile:path]; 45 46 // 字典数组 -> 模型数组 47 NSMutableArray *dealArray = [NSMutableArray array]; 48 for (NSDictionary *dict in dictArray) { 49 XMGDeal *deal = [XMGDeal dealWithDict:dict]; 50 [dealArray addObject:deal]; 51 } 52 53 _deals = dealArray; 54 } 55 return _deals; 56 } 57 58 59 - (void)viewDidLoad { 60 [super viewDidLoad]; 61 62 // 设计模式:代理设计模式 63 64 XMGLoadMoreFooter *footer = [XMGLoadMoreFooter footer]; 65 footer.delegate = self; 66 self.tableView.tableFooterView = footer; 67 68 XMGPageView *pageView = [XMGPageView pageView]; 69 pageView.imageNames = @[@"2c97690e72365e38e3e2a95b934b8dd2", @"2c97690e72365e38e3e2a95b934b8dd2", @"2c97690e72365e38e3e2a95b934b8dd2", @"2c97690e72365e38e3e2a95b934b8dd2"]; 70 self.tableView.tableHeaderView = pageView; 71 } 72 73 #pragma mark - <XMGLoadMoreFooterDelegate> 74 - (void)loadMoreFooterDidClickLoadMoreButton:(XMGLoadMoreFooter *)footer 75 { 76 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 77 // 加载数据 78 XMGDeal *deal = [[XMGDeal alloc] init]; 79 deal.icon = @"2c97690e72365e38e3e2a95b934b8dd2"; 80 deal.title = @"xxxx"; 81 deal.price = @"6546"; 82 deal.buyCount = @"90"; 83 [self.deals addObject:deal]; 84 85 // 刷新表格 86 [self.tableView reloadData]; 87 88 // 结束footer的加载状态 89 XMGLoadMoreFooter *footer = (XMGLoadMoreFooter *)self.tableView.tableFooterView; 90 [footer endLoading]; 91 }); 92 } 93 94 #pragma mark - Table view data source 95 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 96 return self.deals.count; 97 } 98 99 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 100 // 创建cell 101 XMGDealCell *cell = [XMGDealCell cellWithTableView:tableView]; 102 103 // 取出模型数据 104 cell.deal = self.deals[indexPath.row]; 105 106 return cell; 107 } 108 109 @end