<原创 转载请标明来源>
子控件需要子控件所在的控制器来帮其做一些事情,此时子控件需要通过代理模式实现.
举例:
控制器OneViewController里有一个子控件叫SubView(自定义View), SubView上有一个按钮, 点击按钮要做的事是push到SecondViewController, 由于push到SecondViewController需要控制器来做,所以点击SubView上的按钮时,SubView需要通过代理来委托OneViewController做一些事,即push到SecondViewController.
步骤一:
在自定义View即SubView.h 里面写 @protocol 出现提示,敲回车, protocolname 的书写格式:子控件名+Delegate 即SubViewDelegate 然后是方法 @optional(非必须) @request(必须有的) 写代理方法时注意书写格式 首先要有委托方本身 举例如下
-(void)SubView:(SubView *)subView DoSomething;
上面这种不需要传参数的方法一般写成
-(void)SubViewDoSomething:(SubView *)subView;
仿照苹果官方书写格式 比如scrollView的代理方法:
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
步骤二:
还是在自定义View即SubView.h里声明代理变量,用来
用于事件发生后告诉哪个代理
声明代理变量(属性)格式 用weak 后面是id<上面写的代理名字> delegate;
例如: @property (nonatomic, weak) id<SubViewDelegate> delegate;
必须用weak 不然会导致循环引用,造成控制器和子控件无法被释放,继而造成内存泄露.
写到这儿会报错,此时在@protocol上面写
@class 子控件名.h
举例: @class SubView.h
告诉编译器这是一个class,编译时给通过
最后 在子控件里使用代理 if 用来判断代理是不是实现了这个方法
if ([self.delegate respondsToSelector:@selector(xx代理方法xx)]) {
[self.delegate xx代理方法xx];
}
在执行方法的控制器里要有代理方法
控制器首先要导入代理<SubViewDelegate>
然后在声明SubView的地方 SubView.delegate =self;
还要有代理方法.