iOS代理的基本使用

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

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

使用步骤

1、声明代理

定义一个协议;定义代理方法;设置代理属性。
在类的.h中声明:

// 引入类名
@class PDmyHeadView;

@protocol PDmyHeadViewDelegate      //定义协议(命名:类名+Delegate)

-(void)clickHeadButton:(PDmyHeadView *)headView headButton:(UIButton *)headImgBtn;   //代理方法 (参数:类对象+其他)

@end


@interface PDmyHeadView : UIView

@property(nonatomic,weak) id 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都实现了方法
-执行的操作是,从类A跳转到类B,从类B跳转至类C,点击类C的按钮,只有类B响应了。

iOS代理的基本使用_第1张图片
QQ.png
iOS代理的基本使用_第2张图片
QQ.png

你可能感兴趣的:(iOS代理的基本使用)