创建类的代理(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

results matching ""

    No results matching ""