之前做了半年的iOS,刚入了门,又被拉去转战java,现在iOS的那位大佬离职了,又被弄过来维护app,之前对于iOS中的delegate一直都是半知半解,所以刚好趁着这个机会把我所了解的记下来,以便日后查阅。
- delegate的理解
delegate, 也就是代理模式(设计模式的一种),我现在所了解的代理模式是,当我有事要做但是没空的时候,我就可以请别人帮下忙,我告诉你我要做什么,但是具体怎么做,那是你的事了,就比如说,我想去约个妹纸出来玩,但是自己刚好现在有事不能约,或者自己不好意思约,这时候可以请朋友帮忙约一下,这时朋友就是你的代理(被委托者)了,你就是委托者,你告诉他你的目的是要约妹纸出来玩,约妹纸出来玩也就是你和他之间的协议,至于他怎么把妹纸约出来,你是不用关心的。
delegate最常用的地方就是逆向传值了(正向传值直接用属性传值就行了)
一般的委托者需要做的事:
1、创建协议(也就是代理要实现的方法)
2、声明委托变量
3、设置代理(也可以在代理中设置)
4、利用委托变量来调用协议方法(也就是让代理者开始执行协议)
代理需要做的事:
1、遵循协议
2、实现协议方法
这里有两个页面VCA、VCB,我先从VCA Push到VCB,在VCB的一个textfield中输入我想要传的值,等点击按钮POP回到VCA的时候,把VCB中textfield中的值展示到VCA的label中,这时候VCB就是委托者,VCA就是代理,代码如下:
1、创建协议
//在VCB中创建协议 //ViewControllerB.h //创建协议 @protocol VcBDelegate <NSObject> - (void)sendValue:(NSString *)value; //声明协议方法 @end
2、声明委托变量
//ViewControllerB.h @interface ViewControllerB : UIViewController @property (nonatomic, weak)id<VcBDelegate> delegate; //声明协议变量 @end
3、设置代理 (我是在VCA按钮跳转的时候设置的代理,所以是在VCA.m中设置的)
//ViewControllerA.m - (void)btnClicked { ViewControllerB *vcB = [ViewControllerB new]; vcB.delegate = self; [self.navigationController pushViewController:vcB animated:YES]; }
4、利用委托变量来调用协议方法(也就是让代理者开始执行协议)
- (void)backActionClicked { //当代理响应sendValue方法时,把_tx.text中的值传到VCA if ([_delegate respondsToSelector:@selector(sendValue:)]) { [_delegate sendValue:_tx.text]; [self.navigationController popViewControllerAnimated:YES]; } }
5、在代理(ViewControllerA)中遵循协议
//viewControllerA.m @interface ViewControllerA ()<VcBDelegate>//遵循协议 @property (nonatomic, strong) UILabel *recievedLB; @end
6、代理实现协议方法
//ViewControllerA.m //实现协议方法,把接收到的值展示到Label中 - (void)sendValue:(NSString *)value { _recievedLB.text = value; }
这样就OK了。
附上模拟器的效果图:
最后附上demo的git地址:https://github.com/fenglee594/delegateDemo
不喜勿喷,欢迎讨论。