首页 > 技术文章 > IOS-委托代理(degegate)

mcj-coding 2014-02-19 11:08 原文

委托代理:

委托代理(degegate)顾名思义,把某个对象要做的事情委托给别的对象去做。那么别的对象就是这个对象的代理,代替它来打理要做的事。反映到程序中, 首先要明确一个对象的委托方是哪个对象,委托所做的内容是什么。委托机制在很多语言中都用到的,这只是个通用的思想,网上会有很多关于这方面的介绍。 那么在苹果开发过程中,用到委托的程序实现思想如下,我主要拿如何在视图之间传输信息做个例子。譬如:在两个页面(UIView视 图对象)实现传值,用委托(delegate)可以很好做到

代理设计模式
1.使用场合:
1> 当A对象发生了一些事情,想告诉B对象,就让B对象成为A对象的代理
2> B对象想监听A对象发生的一些事情,就让B对象成为A对象的代理

2.步骤
1> 定义一份代理协议(比如QQGroupHeaderDelegate)(等着代理对象去实现)
* 协议名都以控件的类名开头,比如QQGroupHeader的代理协议叫做QQGroupHeaderDelegate
* 协议里面的方法一般都不强制代理去实现,所以方法前面加上@optional
* 协议里面的方法名都以类名开头(但是不加前缀,比如QQGroupHeader的代理方法都是以groupHeader开头)
* 协议里面的方法必须能传入控件本身这个参数

2> 定义一个代理属性
@property (nonatomic, weak) id<QQGroupHeaderDelegate> delegate;

3> 设置代理属性(代理用weak)
header.delegate = controller;

4> 通知代理
* 先检测代理有没有实现对应的代理方法
if ([_delegate respondsToSelector:@selector(groupHeaderClick:)]) {
    [_delegate groupHeaderClick:self];
}

 


5> 一段实例代码

1. 定义一分协议
@class HGStageView;
@protocol HGStageViewDelegate <NSObject>
//@required的表示这个方法必须实现,否则将会得到编译器的警告,而@optional 为可选实现,为默认值
@optional
// 一般将自己传出去,它的代理好获得相应的值
- (void)stageViewIconClick:(HGStageView *)stageView;
@end

2. 让代理成为自己的属性

// 代理一般用weak
@property (nonatomic, weak) id<HGStageViewDelegate> delegate;

3.触发代理事件通知代理

#pragma mark 点击了LOGO
- (IBAction)iconClick {
    if ([_delegate respondsToSelector:@selector(stageViewIconClick:)]) {
        [_delegate stageViewIconClick:self];
    }
}

4.遵守代理协议

@interface HGStagesViewController () <HGStageViewDelegate>

5.实现代理方法

#pragma mark - stageView的代理方法
- (void)stageViewIconClick:(HGStageView *)stageView
{
    // 执行对应的线,并且传递模型数据(sender对应的模型数据会传给prepareForSegue方法的sender参数)
    [self performSegueWithIdentifier:@"stages2ready" sender:stageView.stage];
}

推荐阅读