代理模式设计

[toc]

代理模式设计

用处

当我们需要监听某个控件的点击的时候,我们总希望可以相应的会调用某个方法,去实现我们想要实现的效果,想要实现这种方式,通知是一个方法,当然我们这里说的是另一个方法___代理

比如,我们封装了一个控件叫WXLoadMoreFooter, 应用到了我们的一个页面中,当我们点击它的时候,能够加载更多的数据,这个时候我们就需要监听它的点击,

协议可以和头文件写在一起,没必要单独弄一个. h 文件出来,当然也可以.
WXLoadMoreInfo.h

#import 

//协议
class WXLoadMoreFooter;
@protocol WXLoadMoreFooterDelegate 

//协议里定义一个可以选择实现的方法
@optional
- (void)loadMoreFooterDidClickLoadMoreButton:(WXLoadMoreFooter *)footer;

@end


@interface WXLoadMoreFooter : UIView

+( instancetype)footer;

@property (nonatomic,weak)id 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 ()

@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] 代理方法回调成功.

你可能感兴趣的:(代理模式设计)