时间:2021-05-20
在iOSAPP开发的过程中 我们会用到很多需要传值的地方 传值的方式也多种多样 有:代理传值、通知传值、KVC、KVO、block、单例 等。其中block 因为其简洁实用规范的代码 无疑是大牛们传值的不二选择 但对于初学者来说要理解并能运用 起初确实有些难以理解 以下我将细细的介绍下block
首先我总结了一下block的公式:
下面是一个简单的block
// 声明 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里面
- (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里面
Next_ViewController.m里面
<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> - (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.局部变量 定义一个图片名字的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 里面 添加代码
// 全局变量 // 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];再添加两个方法
- (void)loadData { imageNameBlock_1(@"17.jpg"); } - (void)viewWillAppear:(BOOL)animated { [self loadData]; }当出现循环引用是我们用__weak修饰下 但具体机制还不太懂 希望高人指点,感谢大家对的支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
前言在iOS通过代理逆向传值的方式详解一文中,分析了如何利用代理模式来逆向传值,其实还有一些其他的方式,如通知、Block等,相比较代理,我个人认为反而要简单些
前言Objective-C作为一门资历很老的语言,添加了Block这个特性后深受广大iOS开发者的喜爱。在Swift中,对应的概念叫做Closure,即闭包。虽
最近一直在看Java的相关东西,因为我们在iOS开发是,无论是Objective-C还是Swift中,经常会用到委托代理回调,以及Block回调或者说是闭包回调
JS闭包详解及实例:最近学习JS的基础知识,学习了闭包的知识点,有很多疑惑,这一段时间还是一直有在看闭包的相关知识理解就更深入了一点,下面说说我的理解。func
微信小程序页面传值详解一.跨页面传值.1.用navigator标签传值或wx.navigator,比如这里将good_id=16参数传入detail页面,然后d