- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章iOS(闭包)block传值详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在iOSAPP开发的过程中 我们会用到很多需要传值的地方 传值的方式也多种多样 有:代理传值、通知传值、KVC、KVO、block、单例 等。其中block 因为其简洁实用规范的代码 无疑是大牛们传值的不二选择 但对于初学者来说要理解并能运用 起初确实有些难以理解 以下我将细细的介绍下block 。
首先我总结了一下block的公式:
下面是一个简单的block 。
1
2
3
4
5
6
7
8
9
10
|
// 声明
void(^blockName)(int num,NSString *string);
// 实现
blockName = ^(int num,NSString *string)
{
NSLog(@
"%d,%@"
,num,string);
};
// 调用
blockName(520,@
"phyone_"
);
}
|
由该例可以看出block的代码执行顺序和其他的代码执行顺序不一样 它是先执行声明代码 然后执行调用代码 最后才执行实现代码 由此我们利用block的回调性质 达到我们传值效果 当然这只是在一个页面的一段代码 只是说明了它具有传值的作用 下面我们来试试 多页面之间的block反向传值 由于是反向传值 所以我们创建两个ViewController (ViewController,Next_ViewController)先由ViewController跳到Next_ViewController里将里面的值反向传给ViewController 以下是代码 。
ViewController.m里面 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
- (
void
)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor purpleColor];
UILabel *lable = [[UILabel alloc]initWithFrame:CGRectMake(100, 200, 200, 100)];
lable.backgroundColor = [UIColor brownColor];
[self.view addSubview:lable];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap)];
[self.view addGestureRecognizer:tap];
}
- (
void
)tap
{
Next_ViewController *NVC = [[Next_ViewController alloc]init];
NVC.block = ^(NSString *content){
NSLog(@
"%@"
,content);
UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(100, 200, 100, 100)];
[button setTitle:content forState:UIControlStateNormal];
button.backgroundColor = [UIColor orangeColor];
[self.view addSubview:button];
};
[self presentViewController:NVC animated:YES completion:nil];
}
|
Next_ViewController.h里面 。
1
2
|
//block 是分配在栈里面的用copy
@property(nonatomic,copy)
void
(^block)(NSString *content);
|
Next_ViewController.m里面 。
1
2
3
4
|
<p style=
"margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"
><span style=
"font-size:12px;"
>{</span></p>
<p style=
"margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"
><span style=
"font-size:12px;"
>
void
(^imageNameBlock_1)(NSString *imageName);</span></p>
<p style=
"margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"
><span style=
"font-size:12px;"
>
void
(^lableBlock)(NSString *tontentText);</span></p>
<p style=
"margin-top: 0px; margin-bottom: 0px; font-family: Menlo;"
><span style=
"font-size:12px;"
>}</span></p>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
- (
void
)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor orangeColor];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 200, 100, 50);
[button setTitle:@
"123456"
forState:UIControlStateNormal];
button.backgroundColor = [UIColor redColor];
[button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
- (
void
)buttonAction:(UIButton *)sender
{
// 点击按钮 返回上一个页面 同时通过block 把这个值传到上一个页面
self.block(sender.titleLabel.text);
[self dismissViewControllerAnimated:nil completion:nil];
}
|
另外:block 还有两个问题 。
1.怎么改变block里面的值 。
用上面的代码 在ViewController.m viewDidLoad 里面 添加代码 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
1.局部变量
定义一个图片名字的Block
*/
// 局部变量
void
(^imageNameBlock)(NSString *imageName);
// 如果想修改Block里面的值 需添加__block修饰
// __block UIImage *image;
imageNameBlock = ^(NSString *imageName)
{
image = [UIImage imageNamed:imageName];
self.view.backgroundColor = [UIColor colorWithPatternImage:image];
};
imageNameBlock(@
"17.jpg"
);
|
就会出现 Use of undeclared identifier 'image' 错误情况 原因是我们试图改变block里面的值 解决办法就是 添加 __block 修饰(解注释 。
__block UIImage *image;) 就行了 。
2.block的循环引用 。
用上面的代码 在ViewController.m viewDidLoad 里面 添加代码 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// 全局变量
// block循环 引用 解决 我们用弱引用 __block
__weak ViewController *VC = self;
__block UIImage *image = nil;
imageNameBlock_1 = ^(NSString *imageName)
{
image = [UIImage imageNamed:imageName];
VC.view.backgroundColor = [UIColor colorWithPatternImage:image];
};
UILabel *lable = [[UILabel alloc]initWithFrame:CGRectMake(100, 200, 200, 100)];
lable.backgroundColor = [UIColor brownColor];
[self.view addSubview:lable];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap)];
[self.view addGestureRecognizer:tap];
|
再添加两个方法 。
1
2
3
4
5
6
7
8
9
|
- (
void
)loadData
{
imageNameBlock_1(@
"17.jpg"
);
}
- (
void
)viewWillAppear:(
BOOL
)animated
{
[self loadData];
}
|
当出现循环引用是我们用__weak修饰下 但具体机制还不太懂 希望高人指点,感谢大家对我的支持.
最后此篇关于iOS(闭包)block传值详解的文章就讲到这里了,如果你想了解更多关于iOS(闭包)block传值详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!