delegate的使用

delegate 代理是一种设计模式,即一个对象不能完成的事情,委托另一个对象帮其完成。

比如说:A 要订购 电影票,但是 A 自己没办法去订购,于是 A 委托 B 帮其订购电影票,则 B 成为 A 的代理(也称为 A 的委托),同时帮 A 完成订购电影票的事情。

具体实现方法:

1、定义协议

1-1、协议名称

1-2、必须实现的代理方法

1-3、非必须实现的代理方法

如:

 

@protocol SFDelegate <NSObject>
     
@required
- (void)orderTicker;
     
@optional
- (void)getTicker;
     
@end

 

     

2、定义代理

如:

 

@property (nonatomic, weak) id<SFDelegate> tickerDelegate;

 

说明:定义代理为属性时,使用weak修饰,避免造成对象的循环引用,引起内存泄露。     

3、定义代理方法实现方式

如:

 

- (void)orderTickerForMe
{
         NSLog(@"叫人帮我订票");
         
         if (self.tickerDelegate && [self.tickerDelegate respondsToSelector:@selector(orderTicker)])
         {
             [self.tickerDelegate orderTicker];
         }
}

 

- (void)getTickerForMe
{
         NSLog(@"叫人帮我取票");
         
         if (self.tickerDelegate && [self.tickerDelegate respondsToSelector:@selector(getTicker)])
         {
             [self.tickerDelegate getTicker];
         }
}

 

 

使用注意事项:

1、导入该对象的头文件

2、实例化该对象

3、设置该对象的代理

4、添加该对象的协议

5、实现该对象的代理方法

     

说明:

1、delegate 代理方法是一对一的关系,即一个 A 对象,同一时间内只能委托一个 B 对象帮其完成需要完成的事件。

2、使用场景:

2-1、由其他对象协助完成其他事情

2-2、用于传值

 

定义协议的视图控制器

 

// .h文件
#import <UIKit/UIKit.h>

@protocol SFDelegate <NSObject>

@required
- (void)orderTicker;

@optional
- (void)getTicker;

@end


@interface SFViewController : UIViewController

@property (nonatomic, assign) id<SFDelegate> tickerDelegate;

- (void)orderTickerForMe;

- (void)getTickerForMe;

@end

 

// .m文件
#import "SFViewController.h"

@interface SFViewController ()

@end

@implementation SFViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)orderTickerForMe
{
    NSLog(@"叫人帮我订票");
    
    if (self.tickerDelegate && [self.tickerDelegate respondsToSelector:@selector(orderTicker)])
    {
        [self.tickerDelegate orderTicker];
    }
}

- (void)getTickerForMe
{
    NSLog(@"叫人帮我取票");
    
    if (self.tickerDelegate && [self.tickerDelegate respondsToSelector:@selector(getTicker)])
    {
        [self.tickerDelegate getTicker];
    }
}

@end


实现代理方法的视图控制器

 

 

#import "SYViewController.h"
#import "SFViewController.h"

@interface SYViewController () <SFDelegate>
//{
//    SFViewController *sfVC;
//}

@property (nonatomic, strong) SFViewController *sfVC;

@end

@implementation SYViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    self.title = @"sf delegate";
    
    UIBarButtonItem *order = [[UIBarButtonItem alloc] initWithTitle:@"order" style:UIBarButtonItemStyleDone target:self action:@selector(tickerOrder)];
    UIBarButtonItem *get = [[UIBarButtonItem alloc] initWithTitle:@"get" style:UIBarButtonItemStyleDone target:self action:@selector(tickerGet)];
    self.navigationItem.rightBarButtonItems = @[order, get];
    
    self.sfVC = [[SFViewController alloc] init];
    self.sfVC.tickerDelegate = self;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)tickerOrder
{
    [self.sfVC orderTickerForMe];
}

- (void)tickerGet
{
    [self.sfVC getTickerForMe];
}

- (void)orderTicker
{
    NSLog(@"我帮你订了票");
}

- (void)getTicker
{
    NSLog(@"我帮你取了票");
}

@end

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

番薯大佬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值