Block高级用法:Block传值UI_12(3)
无返无参
void printfHello(int a);
//函数的实现
void printfHello(int a){
printf("hello wold\n");
}
//函数指针的类型
//void (*)(int);
//定义一个函数指针变量
//函数的调用
printfHello(3);
//使用函数指针调用
p(1);
//给block变量赋值
myBlock = ^(int a){
NSLog(@"%d",a);
};
//block变量的调用
myBlock(10);
//无返无参
typedef void(^aBlock) ();
//使用重命名的block类型定义block变量
aBlock show
= ^(){
NSLog(@"我是中国人");
};
//block调用
show();
使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值:
先说一下思想:
首先,创建两个视图控制器,在第一个视图控制器中创建一个UITextField和一个UIButton,其中UILabel是为了显示第二个视图控制器传过来的字符串,UIButton是为了push到第二个界面。
第二个界面的只有一个UITextField,是为了输入文字,当输入文字,并且返回第一个界面的时候,当第二个视图将要消失的时候,就将第二个界面上TextFiled中的文字传给第一个界面,并且显示在UITextField上。
=
[[[UINavigationController
alloc]initWithRootViewController:[FirstViewController
new]]autorelease];
()
@property(nonatomic,retain)UITextField *textField;
@property(nonatomic,retain)UIButton
*button;
@end
@implementation FirstViewController
- (void)dealloc{
self.textField = nil;
self.button= nil;
[super
dealloc];
}
- (void)viewDidLoad {
[super
viewDidLoad];
self.textField = [[UITextField alloc]initWithFrame:CGRectMake(50, 100, 220, 30)];
self.textField.placeholder = @"请输入内容";
self.textField.borderStyle = UITextBorderStyleRoundedRect;
[self.view addSubview:self.textField];
[self.textField release];
self.button = [UIButton buttonWithType:(UIButtonTypeSystem)];
self.button.frame = CGRectMake(100, 160, 120, 30);
[self.button setTitle:@"进入下一个界面" forState:( UIControlStateNormal)];
[self.view
addSubview:self.button];
//添加方法
[self.button
addTarget:self action:@selector(handlePush :) forControlEvents:(UIControlEventTouchUpInside)];
- (void)handlePush : (UIButton *)push{
SecondViewController
*secondVC =
[[SecondViewController
alloc]init];
#warning 3
在push之前给block属性赋值
typeof(self) weakSelf = self; block内部不会持有,也不会造成他的引用计数器+1
__block typeof(self) weakSelf = self;
secondVC.passValue = ^(NSString *string){
//在block块内给空间赋值
weakSelf.textField.text =
string;
};
[self.navigationController
pushViewController:secondVC
animated:YES];
[secondVC release];
#warning 1 给block起别名
typedef void(^passBlock)(NSString *);
//1.定义block类型起别名
UIViewController
//block变量存在于栈区,用copy修饰后就会存放在堆区,从而保证block块不会丢失,但是申请了内存就要释放内存
@property(nonatomic,copy)aBlock testBlock;
//@property
(nonatomic,copy)void (^testBlock2)();
#warning 2
定义block类型的变量
@property(nonatomic,copy)passBlock passValue;
typedef
void(^aBlock)
();
@interface SecondViewController
()
@property(nonatomic,retain)UITextField *textField;
- (void)dealloc{
self.textField = nil;
self.button = nil;
Block_release(_testBlock);//block 属性释放
NSLog(@"第二个视图被销毁了");
[super
dealloc];
}
- (void)sayHi{
NSLog(@"你好");
}
- (void)viewDidLoad {
[super
viewDidLoad];
self.view.backgroundColor = [UIColor cyanColor];
给block属性赋值
在block访问self,或者属性,或者使用self调用方法,都会造成对当前类的对象的引用计数+1
//MRC
__block SecondViewController *weakSelf =
self;
使用__block修饰的对象block内部不会持有,也不会造成他的引用计数器+1
第二种:
//ARC
__weak SecondViewController *weakSelf1 =
self;
第三种: __block typeof(self) weakSelf3 = self;
__block
typeof(self) weakSelf3 = self;
self.testBlock = ^(){
[weakSelf3 sayHi];
};
self.textField = [[UITextField alloc]initWithFrame:CGRectMake(50, 100, 220, 30)];
self.textField.placeholder = @"请输入内容";
self.textField.borderStyle = UITextBorderStyleRoundedRect;
[self.view addSubview:self.textField];
[self.textField release];
self.button = [UIButton buttonWithType:(UIButtonTypeSystem)];
self.button.frame = CGRectMake(100, 160, 120, 30);
[self.button
setTitle:@"返回上一个界面" forState:( UIControlStateNormal)];
[self.button addTarget:self action:@selector(handlePush :) forControlEvents:(UIControlEventTouchUpInside)];
[self.view addSubview:self.button];
}
- (void)handlePush : (UIButton *)push{
//block的调用
//
self.textBlock();
#warning 4
pop之前调用block块
self.passValue(self.textField.text);
[self.navigationController
popViewControllerAnimated:YES];

中要使用对应的Block_release()
Block高级用法:Block传值UI_12(3)的更多相关文章
- iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)
iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值) 使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 先说一下思想: ...
- iOS block的用法
本章学习目标: 1. 了解何谓block. 2. 了解block的使用方法. Block 是iOS在4.0之后新增的程式语法,严格来说block的概念并不算是基础程式设计的范围,对初学者来说也不是很容 ...
- ios Block详细用法
ios Block详细用法 ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的 ...
- iOS block的用法 by -- 周傅琦君
X.1 初探Block X.1.1 宣告和使用Block 我们使用「^」运算子来宣告一个block变数,而且在block的定义最后面要加上「;」来表示一个完整的述句(也就是将整个block定义视为前面 ...
- iOS中block的用法 以及和函数用法的区别
ios中block的用法和函数的用法大致相同 但是block的用法的灵活性更高: 不带参数的block: void ^(MyBlock)() = ^{}; 调用的时候 MyBlock(); 带参数的 ...
- OC中 block 的用法
block 常用于反向传值 声明 返回值类型 (^block)(参数列表) 调用 闭包的名字=^(参数列表){}: 闭包的名字(): 如: void(^aaaaa)(int num,NSString ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(三) Validation Application Block (高级) 企业库验证应用程序模块之配置文件模式: ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (高级)
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(一) Caching Application Block (高级) Caching Application Bl ...
随机推荐
- spring cloud 入门系列二:使用Eureka 进行服务治理
服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现. Spring Cloud Eureka是Spring Cloud Netflix 微服务套件的一部分 ...
- 47. Permutations II(medium, backtrack, 重要, 条件较难思考)
Given a collection of numbers that might contain duplicates, return all possible unique permutations ...
- HTML入门知识
B/S:浏览器-服务器 C/S:客户端-服务器 更新麻烦 管理麻烦 PHP:基于BS结构进行项目开发的语言 ====================HTML:超文本标记语言 -- 控制网面内容CSS: ...
- SSA-一种适合中小型企业的新型服务架构
写在前面 好久好久没写了,最近刚换了工作,花了几天的时候熟悉了项目,接着就是功能的完善,随后就是对新项目的基础架构搭建. 看过Po主博客的都知道,Po主一直致力于推广.Net Core在微服务架构上的 ...
- python笔记十二(匿名函数)
一.匿名函数 有些情况下,我们需要把函数当做参数传入到另外的函数中,或者是把函数作为某个函数的返回值,此时我们就可以使用匿名函数. 匿名函数的标志是lambda. >>> f = ...
- Dynamics CRM 本地插件注册器连CRMAn unsecured or incorrectly secured fault was received from the other party
今天遇到个问题,在本地打开插件注册器连接到远程CRM服务器时报如下问题 但我在CRM服务器上连接注册器是可以打开的,所以不存在账号权限这类的问题了(当然我用的是超管的账号也不可能存在),最后查询得知是 ...
- Spring Boot 中应用Spring data mongdb
摘要 本文主要简单介绍下如何在Spring Boot 项目中使用Spring data mongdb.没有深入探究,仅供入门参考. 文末有代码链接 准备 安装mongodb 需要连接mongodb,所 ...
- ant编译mysql驱动
修改驱动源码后需要重新编译构建,由于mysql编译需要两个jdk版本且还需要hibernate4和junit,这里记录下. 安装ant. 配置两个jdk,5和8.并修改build.xml配置,如下: ...
- python 函数运算先于单目运算
>>> def f(): >>> -f() - 初一看,-f()比较陌生的样子,细想,这是合理的
- Java异常封装(自己定义错误码和描述,附源码)
真正工作了才发现,Java里面的异常在真正工作中使用还是十分普遍的.什么时候该抛出什么异常,这个是必须知道的. 当然真正工作里面主动抛出的异常都是经过分装过的,自己可以定义错误码和异常描述. 下面小宝 ...