• 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

    你的一次推荐就是对我莫大的支持。感觉不错,给个推荐或者评论吧。
  • 相关阅读:
    javascript package的一种简单"优雅"实现
    高效、快速、专业的外科手术团队
    贝塞尔曲线
    经典格斗游戏《街头霸王》的Javascript实现
    该死的痘痘
    同步/异步与阻塞/非阻塞的区别
    Shell echo用法
    凹凸Linux面试题
    VMware Workstation 9下安装Fedora 18教程(转)
    Linux中locale 详解(转)
  • 原文地址:https://www.cnblogs.com/mancong/p/5382521.html
Copyright © 2020-2023  润新知