zoukankan      html  css  js  c++  java
  • iOS-Block的多种使用

    一.图

    二.代码

    1.viewController.h

    #import <UIKit/UIKit.h>

    @interface ViewController : UIViewController

    @end

    2. viewController.m

    #import "ViewController.h"

    #import "SecondViewController.h"

    @interface ViewController ()

    @end

    /** 什么是Block 

     1. 苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,Block可以在任何时候执行.

     2. Block和函数的相似性:  (1) 可以保存代码

                            (2) 有返回值

                            (3) 有形参

                            (4) 调用方式一样

     3. 标识符 ^

     */

    @implementation ViewController

    - (void)viewDidLoad {

        [super viewDidLoad];

        

        // block 1   ---> 定义一个Block类型答应一个for循环

        [self block1];

        

        // block 2   ---> 定义一个block类型的变量,接受两个参数,做加法运算

        [self block2];

        

        // block 3   ---> bolck的基本使用

        [self block3];

        

        //block 4    ---> Block访问外部变量

        [self block4];

        

        //block 5    ---> 利用tpedef定义block类型

        [self block5];

        

        //block 6   ----> 页面传值

        [self block6];

    }

    #pragma mark 定义一个Block类型答应一个for循环

    - (void)block1

    {

        //定义一个Block类型:名字叫MyBlock

        void(^FirstBlock)(int) = ^(int n)

        {

        

            NSLog(@"%d",n);

            

            for (int i = 0; i < n; i ++)

            {

                NSLog(@"n: %d",i);

            }

        };

        

        //调用block

        FirstBlock(5);

        

        NSLog(@"--结束--");

        

        /** Block执行的顺序

         1. 先执行定义的Block--> FirstBlock.

         2. 调用Block,获取到参数值,然后执行Block语句块.

         */

    }

    #pragma mark 两个参数的Block

    - (void)block2

    {

        /** Block

         1. 带有返回值的Block

         2. 两个参数的Block

         */

        

        int (^SecondBlock)(int,int) = ^(int n1, int n2)

        {

            return n1 + n2;

        };

        

        // 调用block

        NSLog(@"%d",SecondBlock(12,14));

    }

    #pragma mark block的基本使用

    - (void)block3

    {

        /** block基本使用

         1. 定义Block

            (1) 无参数,返回值类型为空   

                void (^ Block)()

            (2) 有参数,返回值为 int

                int (^ Block)(int)

         

         2. 利用block封装代码块

         */

        

        // 利用block封装代码块

        // (1) 无参数无返回值

        void (^FirstBlcok)() = ^()

        {

            NSLog(@"10");

        };

        //调用Block

        FirstBlcok();

        

        // (2) 有参数无返回值

        NSString * (^SecondBlock)() = ^()

        {

            NSLog(@"无参数的有返回值的Blcok");

            return @"无参数的有返回值的Blcok";

        };

        //调用Block

        SecondBlock();

        

        // (3) 有返回值有参数类型

        

         int (^ThirdBlock)(int,int) = ^(int n1,int n2)

        {

            return n1 + n2;

        };

        //调用Block --> ThirdBlock(1,2)返回值类型是int

        NSLog(@"%d",ThirdBlock(1,2));

    }

    #pragma mark block访问外部变量

    - (void)block4

    {

        /**

         1. block内部可以访问外部变量;

         2. 默认情况下,Block内部不能修改外部的局部变量.

         3. 给局部变量加上__block关键字,则这个局部变量可以在block内部进行修改.

         */

        

        __block int a = 0;

        

        void (^fourthBlcok)(int) = ^(int n1)

        {

            a = n1;

            

            NSLog(@"a: %d",a);

        };

        

        fourthBlcok(10);

    }

    #pragma mark 利用tpedef定义block类型

    - (void)block5

    {

        typedef int(^FifthBlock)(int,int);

        

        FifthBlock a,b;

        

        a = ^(int a,int b)

        {

            return a + b;

        };

        

        FifthBlock b2 = ^(int n1,int n2)

        {

            return n1 * n2;

        };

        

        NSLog(@"%@-%@-%@",a,b,b2);

    }

    - (void)block6

    {

        UIButton * button6 = [UIButton buttonWithType:UIButtonTypeCustom];

        button6.frame = CGRectMake(10, 30, 200, 40);

        button6.backgroundColor = [UIColor orangeColor];

        [button6 addTarget:self action:@selector(block6JumpClicked) forControlEvents:UIControlEventTouchUpInside];

        [self.view addSubview:button6];

        

        SecondViewController * secondViewController = [[SecondViewController alloc] init];

        

        secondViewController.changeColorBlock = ^(UIColor * color)

        {

            self.view.backgroundColor = color;

        };

    }

    - (void)block6JumpClicked

    {

        /** 页面传值Block注意点

         1. 在传值页面   用typedef定义Block

         2. 在传值页面   创建block属性

         3. 在传值页面   模态跳转回来的时候,调用该Block

         4. 在接收值页面 实现block代码块

         */

        

        

        SecondViewController * secondViewController = [[SecondViewController alloc] init];

        

        //实现block

        secondViewController.changeColorBlock = ^(UIColor * color)

        {

            self.view.backgroundColor = color;

        };

        

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

            

        }];

    }

    @end

     3. SecondViewController.h

    #import <UIKit/UIKit.h>

    typedef void(^ChangeColorBlock)(UIColor * color);

    @interface SecondViewController : UIViewController

    @property (nonatomic, strong) ChangeColorBlock changeColorBlock;

    @end

    4.SecondViewController.m

    #import "SecondViewController.h"

    @interface SecondViewController ()

    @end

    @implementation SecondViewController

    - (void)viewDidLoad {

        [super viewDidLoad];

        self.view.backgroundColor = [UIColor redColor];

        

        

        [self createButton];

    }

    - (void)createButton

    {

        UIButton * button6 = [UIButton buttonWithType:UIButtonTypeCustom];

        button6.frame = CGRectMake(10, 30, 200, 40);

        button6.backgroundColor = [UIColor orangeColor];

        [button6 addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];

        [self.view addSubview:button6];

    }

    - (void)back

    {

        

        //调用block

        if (self.changeColorBlock)

        {

            self.changeColorBlock(self.view.backgroundColor);

        }

        

        [self dismissViewControllerAnimated:YES completion:^{

            

        }];

    }

    @end

    你的一次推荐就是对我莫大的支持。感觉不错,给个推荐或者评论吧。
  • 相关阅读:
    php多态
    ssl certificate problem: self signed certificate in certificate chain
    test plugin
    open specific port on ubuntu
    junit vs testng
    jersey rest service
    toast master
    use curl to test java webservice
    update folder access
    elk
  • 原文地址:https://www.cnblogs.com/mancong/p/5382521.html
Copyright © 2011-2022 走看看