[toc]
代理模式设计
用处
当我们需要监听某个控件的点击的时候,我们总希望可以相应的会调用某个方法,去实现我们想要实现的效果,想要实现这种方式,通知是一个方法,当然我们这里说的是另一个方法___代理
比如,我们封装了一个控件叫WXLoadMoreFooter, 应用到了我们的一个页面中,当我们点击它的时候,能够加载更多的数据,这个时候我们就需要监听它的点击,
协议可以和头文件
写在一起,没必要单独弄一个. h 文件出来,当然也可以.
WXLoadMoreInfo.h
#import <UIKit/UIKit.h>
//协议
class WXLoadMoreFooter;
@protocol WXLoadMoreFooterDelegate <NSObject>
//协议里定义一个可以选择实现的方法
@optional
- (void)loadMoreFooterDidClickLoadMoreButton:(WXLoadMoreFooter *)footer;
@end
@interface WXLoadMoreFooter : UIView
+( instancetype)footer;
@property (nonatomic,weak)id <WXLoadMoreFooterDelegate >delegate ;
@end
WXLoadMoreInfo.m
#import "WXLoadMoreFooter.h"
@interface WXLoadMoreFooter()
@property (weak, nonatomic) IBOutlet UILabel *loadMoreLable;
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *achive;
@end
@implementation WXLoadMoreFooter
//提供一个创建对象的类方法
+(instancetype)footer{
//返回 xib 控件
WXLoadMoreFooter *footer = [[[NSBundle mainBundle]loadNibNamed:NSStringFromClass(self) owner:nil options:nil]lastObject];
return footer ;
}
- (IBAction)loadMore:(id)sender {
self.loadMoreLable.text = @"加载更多数据";
//回调代理方法(告诉代理执行方法)
//先判断代理有没有实现这个方法,如果有实现,再回调这个方法.
if ([self.delegate respondsToSelector:@selector(loadMoreFooterDidClickLoadMoreButton:)]) {
[self.delegate loadMoreFooterDidClickLoadMoreButton:self];
}
}
@end
注意
这里需要注意的是,在回调方法之前,先判断一下代理有木有实现这个方法
,如果没有实现这个方法,直接回调的话,会引起崩溃,所以需要先判断一下,然后在回调.
使用:
#import "ViewController.h"
#import "WXLoadMoreFooter.h"
@interface ViewController ()<WXLoadMoreFooterDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
WXLoadMoreFooter *footer = [WXLoadMoreFooter footer ];
footer.delegate = self;
[self.view addSubview:footer];
}
//实现代理方法
- (void)loadMoreFooterDidClickLoadMoreButton:(WXLoadMoreFooter *)footer{
NSLog(@"代理方法回调成功.");
}
@end
log:
2017-03-29 17:58:08.293 代理模式设计实例[32177:867661] 代理方法回调成功.