iOS代理的基本使用

应用一:类之间数据的传递

  • 下级->上级数据传递

使用代理很好地避免控制器之间相互依赖(互相导入彼此的头文件)这个问题。 用于上下级控制器之间的数据传递,谁成为个人代理,我就能把数据传给谁。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

QQ.png

QQ.png

相关文章
相关标签/搜索