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 ...
随机推荐
- 【C#复习总结】匿名类型由来
1 属性 这得先从属性开始说,为什么外部代码访问对象内部的数据用属性而不是直接访问呢,这样岂不是更方便一些,但是事实证明直接访问是不安全的.那么,Anders Hejlsberg(安德斯·海尔斯伯格) ...
- ELK 6安装配置 nginx日志收集 kabana汉化
#ELK 6安装配置 nginx日志收集 kabana汉化 #环境 centos 7.4 ,ELK 6 ,单节点 #服务端 Logstash 收集,过滤 Elasticsearch 存储,索引日志 K ...
- Java实验链接
第1次实验 课堂实验内容:Java入门+Eclipse+PTA+Git+博客 实验任务书:第01次试验(安装JDK.编辑器.编写出第一个Java程序).pdf Eclipse简明教程(by郑如滨).p ...
- Dynamics CRM2016 Web Api之分页查询
在dynamics crm web api还没出现前,我们是通过fetchxml来实现的,当然这种方式依旧可行,那既然web api来了我们就拥抱新的方式. web api中我们通过指定查询的条数来实 ...
- makefile 和shell文件相互调用
shell 文件内调用makefile文件: #!/bin/bash cd ctemplate-2.1./configuresudo make -f installcd ../cd Templat ...
- 修改hosts立刻生效不必重启
有时我们会通过修改Hosts文件(路径为系统盘:\WINDOWS\system32\drivers\etc\hosts),在修改并保存Hosts文件后需要重启才能使设置生效. 这时可以打开命令提示符 ...
- 从1....n中随机输出m个不重复的数
void knuth(int n, int m) { srand((unsigned) time( NULL)); for (int i = 0; i < n && m; i++ ...
- 使用Android Studio向GitHub提交代码
使用Android Studio向GitHub提交代码 在GitHub上创建一个仓库 填写仓库名称.描述.类型(公有.私有)等信息,点击创建 到此,成功创建了我们的仓库,并且初始化创建了README. ...
- Swift基础之Demo包含刷新,加载,网络请求,MVC
Swift中有一个Alamofire第三方是进行网络请求的,它是AFNetworking的作者写的Swift形式,今天先介绍一下,利用pod导入AFNetworking,SVProgressHUD,M ...
- EventBus详解
EventBus详解 简介 github原文 EventBus... * simplifies the communication between components - decouples eve ...