• iOS中,使用block传值简单应用


         心得:

          笔者感言:解决问题的根本途径,在于知识的灵活运用,你运用的越灵活,所能解决的问题就越多,有人说,有些东西都只是最基础的,不没什么卵用。我想说的是,没什么用,你还学他干嘛,大家还学他干嘛。对于这类人,不想多说什么,我用老子的一句话表达我的观点:天下难事必起于易,简单的东西灵活运用多了,相对而言就难了,在有些人严重,也就有用了,但是一定不能舍弃基础,学到的东西,一定想着去用它,如果不想着去用它,那你费那个时间去学它干嘛?不能想着,为解决一种需求,而寻求某种特定的解决方法,要想着,当你找到一种解决某一问题的方法时,去思考,这个方法,还能解决什么问题?或者说,我再改进这个方法,它又能解决什么问题。

    block简单理解,就是一段匿名的代码块,是具有某种功能的代码块。使用block,更多的是为了两个页面之间的传值。

    有些时候,两个页面之间传值,使用其它方法,会导致两者,循环引用,因此,一些特殊的传值方式就产生了。而block使用起来,更加灵活,更加方便。

    下面已一个简单的例子看一下,他们之间的传值,页面A点击按钮,跳转到页面B,然后把页面B中的值传入到A中。

    ViewController.m文件

    #import "ViewController.h"

    #import "NewViewController.h"

    @interface ViewController ()

    {

        NSString *text;

    }

    @end

    @implementation ViewController

    - (void)viewDidLoad {

        [super viewDidLoad];

        self.view.backgroundColor = [UIColor blueColor];

    //创建一个button按钮,实现视图跳转功能

        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

        button.frame = CGRectMake(50, 100, 100, 100);

        button.backgroundColor = [UIColor greenColor];

        [self.view addSubview:button];

        [button addTarget:self action:@selector(getPress) forControlEvents:UIControlEventTouchUpInside];

    }

    - (void)getPress{

        NewViewController *view = [[NewViewController alloc]init];

        [self presentViewController:view animated:YES completion:^{        

        }];

        

        //得到页面B中的block,获取到B页面中的参数

        [view setMyBlock1:^(NSString *a) {

                    NSLog(@"%@",a);

            

        }];

        

    //得到页面B中的block,获取参数,并传入返回值    

        [view setMyBlock2:^int(NSString *b) 

            NSLog(@"%@",b);

    //传入返回值,可以再B页面中使用

            return 998

        }]; 

    }

     NewViewController.h文件中

    #import <UIKit/UIKit.h>

    @interface NewViewController : UIViewController

    //有参数,无返回值 

    @property(nonatomic,copy)void (^myBlock1)(NSString *a);

     //有参数,有返回值

    @property(nonatomic,copy)int (^myBlock2)(NSString *b);

    @end

     NewViewController.m文件中

    - (void)viewDidLoad {

        [super viewDidLoad];

        self.view.backgroundColor = [UIColor orangeColor];

    //创建一个button按钮,实现视图跳转功能

        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

        button.frame = CGRectMake(50, 100, 100, 100);

        button.backgroundColor = [UIColor greenColor];

        [self.view addSubview:button];

        [button addTarget:self action:@selector(press) forControlEvents:UIControlEventTouchUpInside];    

    }

    //button的点击事件

    - (void)press{    

        NSString *b = @"小龙女";

        //要传的参数,放入到block中

        _myBlock1(b);

        NSString *c = @"杨过";

        int count;

    //接收返回值,并传入参数

        count = _myBlock2(c);

        NSLog(@"count = %d",count);

        

        [self dismissViewControllerAnimated:YES completion:^{

            

        }];    

    }

      心得:从上面可以看出,block可以双向传值,即说的回调。

      我个人理解,传值可以分为两种,一是正向传值,二,是逆向传值。

      以上面两个视图为例,A页面可以present到B页面,若从A传值到B,则可以理解为正向传值,这种传值,方法较多,也比较简单。

      而,要想从B页面中传值到A,一些方法,会导致循环引用,这时使用block,比较简单便捷。我理解为它为逆向传值。当然,还有其它许多传值方式,如代理,通知,kvo。

  • 相关阅读:
    Android RxJava 2.0中backpressure(背压)概念的理解
    Android 解决RecyclerView瀑布流效果结合Glide使用时图片变形的问题
    Android 滚动RecyclerView加载图片时的流畅度优化
    Android RecyclerView 滑动时图片加载的优化
    云计算之路-阿里云上:结合IIS日志分析“黑色30秒”问题团队
    云计算之路-阿里云上:对“黑色30秒”问题的猜想团队
    云计算之路-阿里云上:排查“黑色30秒”问题-为什么请求会排队团队
    云计算之路-阿里云上:Web服务器遭遇奇怪的“黑色30秒”问题团队
    上周热点回顾(4.14-4.20)团队
    上周热点回顾(4.7-4.13)团队
  • 原文地址:https://www.cnblogs.com/zxh-iOS/p/zhangxianhong.html
Copyright © 2020-2023  润新知