• 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 = ^{

    //实现部分

    };

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

  • 相关阅读:
    LeetCode 189. Rotate Array
    LeetCode 965. Univalued Binary Tree
    LeetCode 111. Minimum Depth of Binary Tree
    LeetCode 104. Maximum Depth of Binary Tree
    Windows下MySQL的安装与配置
    LeetCode 58. Length of Last Word
    LeetCode 41. First Missing Positive
    LeetCode 283. Move Zeroes
    《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践》读后感
    删除docker下的镜像
  • 原文地址:https://www.cnblogs.com/liuguan/p/5047015.html
Copyright © 2020-2023  润新知