应用一:类之间数据的传递
- 下级->上级数据传递
使用代理很好地避免控制器之间相互依赖(互相导入彼此的头文件)这个问题。
用于上下级控制器之间的数据传递,谁成为我的代理,我就能把数据传给谁。
使用步骤
1、声明代理
定义一个协议;定义代理方法;设置代理属性。
在类的.h中声明:
// 引入类名
@class PDmyHeadView;
@protocol PDmyHeadViewDelegate <NSObject> //定义协议(命名:类名+Delegate)
-(void)clickHeadButton:(PDmyHeadView *)headView headButton:(UIButton *)headImgBtn; //代理方法 (参数:类对象+其他)
@end
@interface PDmyHeadView : UIView
@property(nonatomic,weak) id<PDmyHeadViewDelegate> delegate; //声明代理属性
@end
PS:释放后,delegate要为nil,否则会是野指针,造成内存泄漏,这也是要用weak来声明delegate的原因。
2、代理调用
在某个触发方法中(如点击),代理的拥有者判断它的代理有无实现上面定义的代理方法,若有,则执行代理方法。
-(void)clickHeader:(UIButton *)headImgBtn{
if([self.delegate respondsToSelector:@selector(clickHeadButton:headButton:)]){
[self.delegate clickHeadButton:self headButton:headImgBtn]; //让代理调用 代理方法
}
}
成为代理,且实现代理方法
//创建
self.myHeadView = [[PDmyHeadView alloc] init];
self.myHeadView.delegate = self;
。。。
//实现headview的代理方法
-(void)clickHeadButton:(PDmyHeadView *)headView headButton:(UIButton *)headImgBtn{
NSLog("--%zd",headImgBtn.tag); //拿到数据
}
补充
只能一对一通信
-假如现在有类A,类B,类C
-类C协议为CDelegate,点击类C的按钮时,相应协议,输出一句话
-类A和类B都实现了<CDelegate>方法
-执行的操作是,从类A跳转到类B,从类B跳转至类C,点击类C的按钮,只有类B响应了。