使用代理很好地避免控制器之间相互依赖(互相导入彼此的头文件)这个问题。 用于上下级控制器之间的数据传递,谁成为个人代理,我就能把数据传给谁。markdown
定义一个协议;定义代理方法;设置代理属性。 在类的.h中声明:atom
// 引入类名
@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的缘由。spa
在某个触发方法中(如点击),代理的拥有者判断它的代理有无实现上面定义的代理方法,如有,则执行代理方法。代理
-(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都实现了方法 -执行的操做是,从类A跳转到类B,从类B跳转至类C,点击类C的按钮,只有类B响应了。code