//代码块与代替代理的设计方法
我就以在自定义视图中(非视图控制器,不能实现视图控制功能),通过代理和代码块两种方法分别实现视图的跳转,进行对比
首先自定义了一个视图,上面有一个已经注册了得BUtton点击监控事件方法-(void)event{};视图的跳转就在这个方法中实现(注意:这个button不在视图控制器里面,就算导了相关头文件,也不能跳转,所以只能通过代理方法,或者代码块等,在这个button(在自定义控件空,非视图控制器)方法中调用相关方法,在视图控制器中去实现)
代理实现方法:
在.h文件中
1,在这个自定义视图中(我再说一遍,这里不是视图控制器,要是视图控制器就不用这么折腾了),声明协议
@protocol Delegate <NSObject>
@optional
- (void)jump;//一个用来视跳转的方法
@end
2,定义属性
@property(nonatomic,weak)id<Delegate>delegate;//名字随便取,习惯用delegate(注意:<Delegate>是上面写的协议,只有这样delegate才便于调用jump方法)
在.m文件中
Button的监控方法-(void)event{};就在这里
-(void)event{
if (self.delegate && [self.delegate respondsToSelector:@selector(jump)])
[self.delegate jump];//当Button按下就执行这里
};//代理的定义就这样完成了!!!!!!
视图的跳转的实现,我们放在了视图控制器中
对上面的自定义视图进行实例化 通过 ***.delegate = self;(这里是使当前self与上面红色的标注的self.delegate指针一致,self.delegate调用jump方法,其实就是当前的self调用该方法)然后在jump方法中直接实现试图跳转就行了
(其实讲到这里,就不用再讲了,因为后边的大家都知道了,大家需要的是上面代理定义处的东西)
那么代码块如何实现了,其实比代理要简单些
来个类型定义
.h文件中
1.typedef void (^block)();
2.定义属性@property(nonatomic,string)block jump;//注意:不带*
.m文件中
3.-(void)event{
self.jump();
};//就这样定义结束了
在视图控制器中的实现结构稍有区别
***.jump = ^{
//实现部分
};
是不是代码块比代理简单啊