创建类的代理(delegate)
制作一个如下的示例:
绿色部分是一个View,假设是SubView,其中包含3个按钮A,B,C,外部View中有个UILabel,我希望点击SubView中的按钮,将按钮的titleLabel中的文字传递到UILabel中。
为SubView创建代理,创建一个方法供SubView类中调用
SubViewDelegate.h
#import <Foundation/Foundation.h>
@protocol SubViewDelegate <NSObject>
- (void)subViewDidButtonClick:(NSString*)str;
@end
再创建SubView
SubView.h
#import <UIKit/UIKit.h>
#import "SubViewDelegate.h"
@interface SubView : UIView
//设置一个代理的对象
@property(weak,nonatomic)id<SubViewDelegate> delegate;
@end
SubView.m
#import "SubView.h"
#import "SubViewDelegate.h"
@implementation SubView
//链接为3个按钮共用的按钮点击事件,并且执行代理中的方法
-(IBAction)btnClick:(UIButton*)btn
{
NSLog(@"%@",[btn description]);
//先检测代理的方法有没有被代理对象实现
if([self.delegate respondsToSelector:@selector(subViewDidButtonClick:)])
{
[self.delegate subViewDidButtonClick:btn.titleLabel.text];
}
}
@end
这样代理就算设置完成了,下面我们在需要作为代理的类中实现对应的代理方法即可
#import "ViewController.h"
#import "SubView.h"
//声明要实现的代理
@interface ViewController () <SubViewDelegate>
@property (weak, nonatomic) IBOutlet UILabel *showLabel;
@property (weak, nonatomic) IBOutlet SubView *subView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//切记要将本类作为代理,很多人明明实现了代理方法,就是不执行,就是因为这里没有设置代理
self.subView.delegate = self;
}
//实现代理的方法,这样当按钮发生点击事件时也会一并执行该方法
- (void)subViewDidButtonClick:(NSString *)str
{
NSLog(@"subViewDidButtonClick");
self.showLabel.text = str;
}
@end
如果写着代理中的方法是非必要实现的,只需在方法声明之前加上@optional