delegate代理的使用

delegate其实是一种思想!它在开发中经常会使用到。例如最常见的tableView就是使用到了代理。

  • 代理最常用的是反向传值!!!通知某个属性发生改变,让代理去实现!

  • 还有就是解耦!!!

  • 下面简单介绍一下使用:

  • 使用代理时,首先要明白它是一种思想!!!

  • 记住使用代理就是 6个步骤就可以了!
    // 第一步,声明协议
    // 第二步,设置代理属性
    // 第二步,通知代理
    // 第4步:遵守协议
    // 第五步:设置成为代理
    // 第六步:实现代理

  • 下面直接用一封装网络的例子来说明:

首先:创建一个请求类:HTTPReqeust
1.当然是:定制协议和协议方法。

  // 1、制定协议
  @protocol HTTPRequestDelegate <NSObject>

  /** 
   WithStatus:下载成功与否
   request:对象本身(把对象传过去,因为对象包含了所有信息)
   */
  - (void)httpRequestLoadingWithStatus:(BOOL)issucceed request:(HTTPReqeust *)request;

  @end

2.设置代理属性(记得weak)
// 2、代理属性
@property (nonatomic,weak) id<HTTPRequestDelegate> delegate;
3.在要实现某个功能时,通知上个界面
// 数据下载完成,通知代理
if ([self.delegate respondsToSelector:@selector(httpRequestLoadingWithStatus:request:)]) {
// 3、通知代理
[self.delegate httpRequestLoadingWithStatus:YES request:self];
}
4.上一个页面ViewController(或另一个页面,遵守协议,并成为HTTPRequest类的代理)
// 4、遵守协议
@interface ViewController () <HTTPRequestDelegate>
5、设置ViewController成为HTTPRequest的代理

  // 调用封装好的类方法
  HTTPReqeust *request = [HTTPReqeust httpReqeustWithStrUrl:@"http://pic14.nipic.com/20110522/7411759_164157418126_2.jpg"];
  // 5、设置成为代理
  request.delegate = self;// 此时self和self.delegate 都是ViewController

6.实现代理方法,干你想干的事咯!

  // 6、实现代理方法       
   (void)httpRequestLoadingWithStatus:(BOOL)issucceed request:(HTTPReqeust *)request{
  if (issucceed) {
  //        NSLog(@"%@",request.dataDict);
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
    imageView.image = request.dataImage;
    [self.view addSubview:imageView];
    }
  }

1.1 设置控件的状态

 启用、禁用
 @property(nonatomic,getter=isEnabled) BOOL enabled;
 选中、不选中
 @property(nonatomic,getter=isSelected) BOOL selected;
 高亮或者不高亮
 @property(nonatomic,getter=isHighlighted) BOOL highlighted;

1.2 设置控件内容的布局

 垂直居中方向
 @property(nonatomic) UIControlContentVerticalAlignment contentVerticalAlignment;
 水平居中方向
 @property(nonatomic) UIControlContentHorizontalAlignment contentHorizontalAlignment;

1.3 添加/删除监听方法

 - (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
 - (void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
1> UIButton    -> UIControl -> UIView
2> UILabel     -> UIView
3> UIImageView -> UIView
4> UITextField -> UIControl

* 代理设计模式,在OC中,使用最为广泛的一种设计模式*

1> 代理的用处是什么?

  • 监听那些不能通过addTarget监听的事件!
  • 主要用来负责在两个对象之间,发生某些事件时,来传递消息或者数据

2> 代理的实现步骤
(1) 成为(子)控件的代理,父亲(控制器)成为儿子(文本框)的代理
(2) 遵守协议->利用智能提示,快速编写代码
(3) 实现协议方法

一般情况下,能使用代理的地方都可以使用通知!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在iOS开发中、好多时候需要涉及到页面传值、而传值又分为正向传值和反向传值 一、 传值 1、正向传值 2、反向传值...
    _老妖怪阅读 1,989评论 8 1
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,201评论 30 471
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,242评论 1 23
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,854评论 18 139
  • 我们生活在一个好时代,物质的极大丰富和井然有序的外部环境,让我们不用再害怕饥荒和担忧人身安全得不到保障。在这个前提...
    博浪沙野鹤阅读 714评论 0 0