大部分按钮的监听都使用代理方式
- 代理模式的作用
- 1.A对象监听B对象的一些行为的时候,A成为B的代理。
- 2.A对象想告诉B对象的一些事情的时候,B成为A的代理,A中调用[self.delegate 协议规定好的名字]
-
解耦,两个控制器之间传递值
- 3.什么时候用呢?
- 当你想监听别人的行为的时候,那么你就成为别人的代理,并实现协议中的特定方法。
- 当你想告诉别人你的一些事情或者传递你的一些数据,让别人帮你完成某些事情的时候,那么就让别人成为你的代理,在自己.h中声明一个代理属性,并在.m的中一些事情的方法里面调用[self.delegate 协议规定好的名字],可以在这个方法里面传递你想要传给代理的数据。
- 一个项目内两个对象之间需要沟通,可以通过代理的方式,而最好不要通过发送通知去通知中心。
- 比如自定义了一个加载更多的xib及继承了UIView的自定义类,由于连线是在JUXIB.m中,当我需要点击加载更多时,需要让控制器去响应这个事件,并去加载数据这个操作。
- 虽然发通知给通知中心,然后控制器收到通知去操作可以,但是这样不好。
- 这个时候引入了代理设计模式。
-
1.首先定义一个协议,协议里面放需要代理去实现的方法,为什么要协议呢?因为代理的属性是id类型(不知谁会成为我的代理,而且成为我的代理那个人用什么方法名去帮我实现需要统一),而且在调用代理的方法的时候,需要有统一的名字,达成一致的方法名。
-
2.协议中方法有两个状态,一个是@optional,一个是@require
- @optional是可选实现,代理类不一定要实现这个方法,所以此时被代理类的.m文件中调用的[self.delegate 协议规定好的名字]必须要做一个判断, if([self.delegate respondsToSelector:@selector(协议中的方法名)])
- require是必须实现,代理类一点遵循了这个协议,必须实现这个状态的方法
3.在需要代理的那个类的.h中定义一个遵循协议的属性(weak),叫delegate。
-
4.此时在连线的按钮的方法里面,调用[self.delegate 协议规定好的名字];,并传入self
-
5.这个时候,想要跟这个类沟通的类或监听这个类内部设置过代理的方法的类需要遵循协议,并成为代理,如下:
6.用了代理模式之后,不用通过通知中心。控制器成功监听到被代理类内部的方法(按钮的点击)或者传递数据给任意控制器,而且不论谁都可以成为代理只要遵循协议。
-
协议的命名规范
-
当没有2个以上的参数的时候,要写类名(除去前缀)+作用的英文:参数。表示谁干了什么。
- 比如 loadMoreFooterDidClick:(JUloadMoreFooter *)footer;
- 苹果自带的- (void)scrollViewDidZoom:(UIScrollView *)scrollView
-
当有两个参数以上的时候,要写 类名(除去前缀):()参数 对谁:()参数 作用:()参数
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath