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
delegate的使用相关推荐
- 理解委托(delegate)及为什么要使用委托
委托:是一种定义方法签名的类型. 当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联. 您可以通过委托实例调用方法. 上述为官方说法,理解起来比较难,举个生活中的例子: 某人有三子,让他们各 ...
- swift中delegate与block的反向传值
swift.jpg 入门级 此处只简单举例并不深究,深究我也深究不来.对于初学者来说delegate或block都不是一下子能理解的,所以我的建议和体会就是,理不理解咱先不说,我先把这个格式记住,对就 ...
- 在请求完成后回调delegate的方法。然而回调时经常遇到这种情况:delegate已经被释放...
最近的项目遇到了网络请求,需要在请求完成后回调delegate的方法.然而回调时经常遇到这种情况:delegate已经被释放,这时调用其方法则会引起crash. objc的runtime中有两种判断类 ...
- 异步使用委托delegate --- BeginInvoke和EndInvoke方法
当我们定义一个委托的时候,一般语言运行时会自动帮委托定义BeginInvoke 和 EndInvoke两个方法,这两个方法的作用是可以异步调用委托. 方法BeginInvoke有两个参数: Async ...
- 对delegate进行扩展 打造通用的计时完成方法
连接数据库是程序员经常要做的事情, 通常情况下, 需要连接SQL Server中哪个数据库是已知的, 用户在输入SQL Server的服务器IP.用户名.密码和数据库名字后, 如果所有信息输入正确, ...
- Swift - 委托(delegate)的介绍,及使用样例
1,委托的说明 委托(delegate)是Cocoa的一个术语,表示将一个对象的部分功能转交给另一个对象. 比如对象A希望对象B知道将要发生或已经发生某件事情,对象A可以把对象B的引用存为一个实例变量 ...
- C#中Action与delegate、EventHandler的差异
Action是一个泛型的委托,其内部即使用delegate去实现,当普通的delegate定义的参数与Action个数.类型一致时,两者实现的功能是一样的.只是Action的方式更加简洁.规范.如下: ...
- 【转】iOS开发-Protocol协议及委托代理(Delegate)传值
原文网址:http://www.cnblogs.com/GarveyCalvin/p/4210828.html 前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来 ...
- c# 带返回值的action_C#知识点讲解之C#delegate、event、Action、EventHandler的使用和区别...
今天来讲一讲<C#delegate.event.Action.EventHandler的使用和区别> 目录 所以,event应运而生 所以,EventHandler应运而生 所以,Acti ...
- iOS视图控制器之间delegate传值
2019独角兽企业重金招聘Python工程师标准>>> // ** *为了从ViewControllerB往回传值到ViewControllerA,我们需要使用协议(Protocol ...
最新文章
- Android ndk 安装教程 以及环境变量配置
- RTX 30系游戏本来了!1月26日开售,售价999美元起
- 瑞幸咖啡官网的视频播放原理讲解
- 找出两个字符串数组中的相同元素
- 我的世界服务器自定义怪物怎么用,我的世界怪物属性自定义教程 怪物属性代码一览...
- mysql的面试2_mysql数据库面试题(2)
- 在SQL Server中加入包含假设和CE模型变化
- VMware player桥接模式不能联网的解决方法
- python简单的聚类分析代码_python kmeans聚类简单介绍和实现代码
- Open3d之八叉树(Octree)
- 微型计算机与巨型计算机相比,微型计算机的特点及应用
- 51单片机 | 红外遥控实验
- 如何免费下载qq音乐 ----ctf学习之php漏洞
- Mysql使用Key/Value方式存储动态扩展字段、对象与HashMap的相互转化
- boot的时候无法进入BIOS,无法使用键盘
- 一个毕业6年的程序员工作经历和成长感悟(终)
- 漫谈数据安全-老板担心敏感数据泄露,该如何建设数据的安全体系?
- 正则匹配ip地址,手机号,对象类型
- 【pandas】dataframe中重复数据比较、筛选、去除等
- Flutter对接第三方高德地图+百度地图基础定位实现