一.图

二.代码

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

iOS-Block的多种使用的更多相关文章

  1. iOS Block界面反向传值

    在上篇博客 <iOS Block简介> 中,侧重解析了 iOS Block的概念等,本文将侧重于它们在开发中的应用. Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C ...

  2. iOS block从零开始

    iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void ...

  3. iOS block 机制

    本文要将block的以下机制,并配合具体代码详细描述: block 与 外部变量 block 的存储域:栈块.堆块.全局块 定义 块与函数类似,只不过是直接定义在另一个函数里,和定义它的那个函数共享同 ...

  4. ios Block详细用法

    ios Block详细用法 ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的 ...

  5. iOS Block的本质(四)

    iOS Block的本质(四) 上一篇文章iOS Block的本质(三)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block内修改变量的值 int main(int ar ...

  6. # iOS Block的本质(三)

    iOS Block的本质(三) 上一篇文章iOS Block的本质(二)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block对对象变量的捕获,ARC 环境 block一般 ...

  7. iOS Block的本质(二)

    iOS Block的本质(二) 1. 介绍引入block本质 通过上一篇文章Block的本质(一)已经基本对block的底层结构有了基本的认识,block的底层就是__main_block_impl_ ...

  8. iOS Block的本质(一)

    iOS Block的本质(一) 1.对block有一个基本的认识 block本质上也是一个oc对象,他内部也有一个isa指针.block是封装了函数调用以及函数调用环境的OC对象. 2.探寻block ...

  9. (译)IOS block编程指南 1 介绍

    Introduction(介绍) Block objects are a C-level syntactic and runtime feature. They are similar to stan ...

  10. [IOS Block和delegate的对比]

    原文:http://blog.sina.com.cn/s/blog_9e8867eb0102uykn.html 这篇文章建议和前一篇一起看, 另外先弄清楚IOS的block是神马东东. 委托和bloc ...

随机推荐

  1. android:configChanges属性总结

    http://blog.csdn.net/zhaokaiqiang1992/article/details/19921703 android中的组件Activity在manifest.xml文件中可以 ...

  2. iframeWin For Easy UI. 为 Easy UI 扩展的支持IFrame插件

    iframeWin For Easy UI. 为 Easy UI 扩展的支持IFrame插件 在一个项目中用了Easy UI,但是发现里面的 Dialog .Window.Messager 弹窗都不支 ...

  3. CSS等高布局

    做一些后台项目,和一下带侧边栏项目的时候登高布局很常用,总结了下有几种 1.margin-bottom方法 这里直接介绍我认为的最佳的侧边栏/分栏高度自动相等方法.核心的CSS代码如下(数值不固定): ...

  4. Linux 查看端口被占用情况

    今天发现服务器上Tomcat 8080端口起不来,老提示端口已经被占用. 使用命令: ps -aux | grep tomcat 发现并没有8080端口的Tomcat进程. 使用命令:netstat ...

  5. ie8下jquery改变PNG的opacity出现黑边,ie6下png透明解决办法

    目前互联网对于网页效果要求越来越高,不可避免的用到PNG图片,PNG分为几种格 式,PNG8 PNG24 PNG32,其中最常用的,也是显示效果和大小比较适中的则是PNG24,支持半透明,透明,颜色也 ...

  6. [C#] zdbviewcs: 跨平台数据库查看器。支持SqlServer、Oracle、MySql等数据库

    作者:zyl910 一.说明 本工具有适合以下情况使用—— * 快速查看数据库中数据及表结构信息.* 测试ADO.Net下连接字符串的写法.* 帮忙分析ADO.Net数据库操作. 二.用法 运行本程序 ...

  7. ubuntu 16.04 vnc server

    安装方法 https://help.ubuntu.com/community/VNC/Servers#vino 系统默认自带的,通过搜索Remote Desktop来找到它 配置好之后,设定一下密码 ...

  8. DIV实现CSS 的placeholder效果

    placeholder是HTML5中input的属性,但该属性并不支持除input以外的元素   但我们可以使用Css before选择器来实现完全相同的效果 <!DOCTYPE html> ...

  9. WPF快速精通版

    命名空间: xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:local="clr-namespace:U ...

  10. android多国语言文件夹文件汇总

    android多国语言文件夹文件汇总如下: 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values-zh-rHK 英语(美国):values-e ...