自定义delegate模式

一、应用场景:
A对象监听B对象的状态
或者B对象的状态改变,通知A对象


二、成为代理
必须遵守协议:
例如:UIScrollViewDelegate:滚动协议
UIAlertViewDelegate:弹框协议
UITextFieldDelegate:文本协议
................

另外苹果官方给出:虽然遵守的协议,但是不强求实现它里面的方法,因为有@optional


三、使用delegate代理步骤
1.先搞清楚谁是谁的代理(delegate)

2.定义代理协议,协议名称的命名规范:控件类名+ Delegate

3.定义代理方法
Ø代理方法一般都定义为@optional
Ø代理方法名都以控件名开头
Ø代理方法至少有1个参数,将控件本身传递出去
Ø
4.设置代理(delegate)对象  (比如myView.delegate=xxxx;)
Ø代理对象遵守协议
Ø代理对象实现协议里面该实现的方法
Ø
5.在恰当的时刻调用代理对象(delegate)的代理方法,通知代理发生了什么事情

(在调用之前判断代理是否实现了该代理方法)



四、自定义delegate模式
一个常见的用法(ViewControler监听自定义的view-->AppView(即AppView.xib对应的类))
第一步:
声明一个属性
AppView.h文件中声明协议和代理属性

@class AppData,AppView;

@protocol AppViewDelegate <NSObject>

@optional
- (void)appViewClickDownLoad:(AppView *)appView;

@end
@interface AppView : UIView

@property (weak, nonatomic) id<AppViewDelegate> delegate;
@end


这里必须提出的是:协议的命名规范,你会经常看到很多协议都是以本身控件的名称命名的,例如UIScrollViewDelegate协议就是以ScorllView命名的,所以我们这里也遵守以下,哪个view声明的我就以哪个类命名。

@property (weak, nonatomic) id<AppViewDelegate> delegate;
声明一个遵守AppViewDelegate 协议的属性提供外部调用。

- (void)appViewClickDownLoad:(AppView *)appView;
声明一个一协议开头的方法。这里的方法含义是:我点击xib的下载按钮控件,然后通过代理,在ViewControler实现控件的增加删除等改变


方法上由一个关键字@optional,表示可以成为代理,但是不强求实现这个方法。


AppView.h文件中实现方法



- (IBAction)download:(UIButton *)button {

    // 告知代理
    if ([self.delegate respondsToSelector:@selector(appViewClickDownLoad:)]) {
        [self.delegate appViewClickDownLoad:self];
    }
 
}

注意:
红色那个方法:判断一下有没有这个方法,如果有这个方法,我就调用 [self.delegate appViewClickDownLoad:self];
如果不加判断,又没有这个方法,直接调用,就会出现错误。




OK!协议和方法都弄好了。接下来就让ViewController成为代理
ViewController.m文件中
1、遵守协议

2、创建AppView对象,拿到里面的代理属性delagate。并赋值给当前的view。
3、实现协议里面的方法

从代码中,我们实现这个方法无非就是想在ViewControler这个类中增加一个控件而已([self.view addSubview:tipMessage];),

但是这个控件的触发确实xib里面按钮。虽然实现方法很多:例如在AppView类中提供一个控件属性,

然后在ViewControler赋值,但是这样做不仅暴露AppView有什么控件,

而且两个类的耦合性增强,一旦其中的一个类不存在或者这个控件属性不存在,程序就运行不了。

所以运用代理的方法可以实现没了你,照样运行,谁也不依赖谁。





































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值