• iOS 中delegate的理解与使用(传值)


    之前对于iOS中的delegate一直都是半知半解,所以刚好趁着这个机会把我所了解的记下来,以便日后查阅。

    - delegate的理解

    delegate, 也就是代理模式(设计模式的一种),我现在所了解的代理模式是,当我有事要做但是没空的时候,我就可以请别人帮下忙,我告诉你我要做什么,但是具体怎么做,那是你的事了,就比如说,我想去约个妹纸出来玩,但是自己刚好现在有事不能约,或者自己不好意思约,这时候可以请朋友帮忙约一下,这时朋友就是你的代理(被委托者)了,你就是委托者,你告诉他你的目的是要约妹纸出来玩,约妹纸出来玩也就是你和他之间的协议,至于他怎么把妹纸约出来,你是不用关心的。

    delegate最常用的地方就是逆向传值了(正向传值直接用属性传值就行了)

    一般的委托者需要做的事:

          1、创建协议(也就是代理要实现的方法)

          2、声明委托变量

          3、设置代理(也可以在代理中设置)

          4、利用委托变量来调用协议方法(也就是让代理者开始执行协议)

    代理需要做的事:

          1、遵循协议

          2、实现协议方法

    这里有两个页面VCA、VCB,我先从VCA Push到VCB,在VCB的一个textfield中输入我想要传的值,等点击按钮POP回到VCA的时候,把VCB中textfield中的值展示到VCA的label中,这时候VCB就是委托者,VCA就是代理,代码如下:

    1、创建协议

    //在VCB中创建协议
    
    //ViewControllerB.h
    
    //创建协议
    @protocol VcBDelegate <NSObject>
    - (void)sendValue:(NSString *)value; //声明协议方法
    @end

    2、声明委托变量

    //ViewControllerB.h
    
    @interface ViewControllerB : UIViewController
    @property (nonatomic, weak)id<VcBDelegate> delegate; //声明协议变量
    @end

    3、设置代理 (我是在VCA按钮跳转的时候设置的代理,所以是在VCA.m中设置的)

    //ViewControllerA.m
    
    - (void)btnClicked
    {
        ViewControllerB *vcB = [ViewControllerB new];
        vcB.delegate = self;
        [self.navigationController pushViewController:vcB animated:YES];
    }

    4、利用委托变量来调用协议方法(也就是让代理者开始执行协议)

    - (void)backActionClicked
    {
        //当代理响应sendValue方法时,把_tx.text中的值传到VCA
        if ([_delegate respondsToSelector:@selector(sendValue:)]) {
            [_delegate sendValue:_tx.text];
            [self.navigationController popViewControllerAnimated:YES];
        }
    }

    5、在代理(ViewControllerA)中遵循协议

    //viewControllerA.m
    
    @interface ViewControllerA ()<VcBDelegate>//遵循协议
    @property (nonatomic, strong) UILabel *recievedLB;
    @end

    6、代理实现协议方法

    //ViewControllerA.m
    
    //实现协议方法,把接收到的值展示到Label中
    
    - (void)sendValue:(NSString *)value
    {
        _recievedLB.text = value;
    }

    这样就OK了。

    附上模拟器的效果图:

    最后附上demo的git地址:点击跳转

    不喜勿喷,欢迎讨论。

  • 相关阅读:
    Linux 查看进程文件文件位置
    硬盘io检查
    centos 一些需要注意的问题
    docker 日常使用问题
    Linux命令行访问网站工具
    开箱即用instantbox
    docker 使用
    在js中关于同名变量和函数的地位争夺问题
    玩转图片上传————原生js XMLHttpRequest 结合FormData对象实现的图片上传
    在vue组件中style scoped中遇到的坑
  • 原文地址:https://www.cnblogs.com/fenglee594/p/7157369.html
Copyright © 2020-2023  润新知