IOS中在自定义控件(非视图控制器)的视图跳转中 代理方法与代码块的比较

 //代码块与代替代理的设计方法

我就以在自定义视图中(非视图控制器,不能实现视图控制功能),通过代理和代码块两种方法分别实现视图的跳转,进行对比

首先自定义了一个视图,上面有一个已经注册了得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 = ^{

//实现部分

};

是不是代码块比代理简单啊

原文地址:https://www.cnblogs.com/liuguan/p/5047015.html