项目开发过程中有一个需求是将下载的图片通过调用微信接口分享出去,但是在实现过程中调用这个微信接口方法的控件类是一个继承自UIView
的类,报错提示为请使用继承自UIViewController
的子类去调用这个接口。此时就必须使用代理将这个接口方法的调用托管到父控件中代为执行【父控件继承UIViewController
】
本篇文章就简单的介绍一下代理的使用方法,以目前的水平就不深究原理了。
一:代理的三大组成
1:协议
用来定义双方要去做什么,协议的内容一般都是方法列表。
相当于是合同
2:代理
代理方,实现具体的操作逻辑,委托方不知道具体的实现细节,只调用即可。
相当于苹果公司
3:委托
委托方,根据协议中的内容委托代理方去完成功能
相当于富士康
注意:一个代理可以有多个委托,一个委托可以有多个代理
说的通俗一点,不就是甲方乙方以及合同吗???
二:实现步骤
需求:
当DateView
中的时间改变后,在SaleHistoryViewController
中实现改变所有的button颜色的逻辑操作。即改变button颜色的方法调用在DateView
页面,实际的改变操作是在SaleHistoryViewController
中,以上就是需求,需要使用代理来实现相应的操作。
1: 委托方创建合同:制定协议
所谓的协议就是合同,一般都是由需求方去制定,因此协议是写在委托方上的。
在DateView
文件上
@protocol DateViewDelegate <NSObject>
- (void)changeAllButton; // 协议内容,方法列表
@end
2:委托方委派钦差大臣:创建代理对象
在DateView
文件中需要有一个对象去调用这个代理方法,而这个代理对象的类型就是刚刚制定的协议。
@interface DateView : UIView
@property (nonatomic, weak)id <DateViewDelegate>delegate;
@end
3:代工工厂敲定合同: 实现协议
SaleHistoryViewController
相当于富士康代工工厂,在工作之前,需要也签一下合同
@interface SaleHistoryViewController ()<DateViewDelegate>{
// 定义的其他变量
。
。
。
}
@end
4: 确定具体代工哪条生产线:绑定代理对象
富士康公司不仅为苹果代工他还为其他公司代工,生产线非常的多,因此你需要在特定的生产线上将他的代理对象绑定一下,两者相互绑定刻上一个章。
// dateView为实例化的DateView对象
dateView.delegate = self;
5:代工工厂建生产线:创建实现方法
代工工厂SaleHistoryViewController
,实际的生产线都在这。在这里写具体的实现逻辑供委托方去调用
// 执行改变所有的button的颜色
-(void)changeAllButton{
for (UIButton *button in btnArr) {
[button setBackgroundColor:[UIColor whiteColor]];
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
}
}
6:听老板命令行事: 触发代理方法
老板说代工工厂何时开工,代工工厂就得何时开工
if (self.delegate && [self.delegate respondsToSelector:@selector(changeAllButton)]) {
[self.delegate performSelector:@selector(changeAllButton)];
}
说明:在这里使用if语句是为了筛选出指定工厂的,
首先要再次确定当前公司已经指定了钦差大臣(self.delegate
)其次要确定代理工厂中存在这条指定的代工生产线( [self.delegate respondsToSelector:@selector(changeAllButton)]
)。符合条件后进入调用环节,钦差大臣调用生产线( [self.delegate performSelector:@selector(changeAllButton)]
)。
三:最后的话
对iOS了解的只不过才是刚刚开始,斗胆将代理使用调侃的方式进行总结了一下,如果有错误,还请能够直接指出来。非常感谢!