代码块反向传值以及反向处理UI

来源:互联网 发布:内核优化 编辑:程序博客网 时间:2024/06/15 17:37

我们在实现功能的时候,常常会遇到从一个页面A跳转到页面B,然后在页面B进行一些交互以及处理等,之后可能会把处理得到的一些数据反传给A使用,并且可以通过在页面B的一些操作把页面A的UI也进行调整,这时候就可以用到代理(即委托)或者代码块了。

因为上一篇对代码块做了简单的介绍,所以这次就用代码块来实现这一功能:

首先,我们先建造两个继承自UIViewController的类

MainViewController(工程的主页面)和FuZhuViewController(主页面推向的下一级页面)

下面开始处理了

1,把FuZhuViewController.h导入MainViewController中

2,在FuZhuViewController.h中新定义一个代码块类型,用新定义的代码块类型声明一个属性,然后定义一个实例化方法,具体代码如下:

#import <UIKit/UIKit.h>//自定义代码块类型typedef void(^MyBlock)(NSString *str);@interface FuZhuViewController : UIViewController//用定义的代码块类型声明一个属性@property (strong,nonatomic) MyBlock block;//自己写得实例方法-(FuZhuViewController*)initWithBlock:(MyBlock)block;@end

3.在FuZhuViewController.m中实现实例化方法

//自己定义的实例化方法-(FuZhuViewController*)initWithBlock:(MyBlock)block{    if (self=[super init])    {        //这样,self.block代码块可以在本类的任意地方调用        self.block=block;    }    return self;}

4.在FuZhuViewController.m实现一个方法来调用self.block块,self.block块可以在本类的任意地方调用,所以你可以放心的执行各种操作,操作完成后可以再调用这个self.block块,这里就简单额加一个按钮来调用一下作为演示;

在FuZhuViewController.m中写上如下代码:

- (void)viewDidLoad{    [super viewDidLoad];    UIButton *myButton=[UIButton buttonWithType:UIButtonTypeCustom];    [myButton setTitle:@"传值" forState:UIControlStateNormal];    [myButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];    myButton.frame=CGRectMake(100, 400, 50, 50);    [myButton addTarget:self action:@selector(myButtonAction) forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:myButton];}-(void)myButtonAction{    NSString *str=@"路飞赢了";    self.block(str);    [self.navigationController popViewControllerAnimated:NO];}

这里的self.block(str)的行为主体是在MainViewController中实现的,所以这里可以给行为主体传参数,也可以在行为主体中根据参数改变MainViewController界面的UI

5,简单的在MainViewController.m中添加一个按钮来调用一个方法,实现跳转到FuZhuViewController页面并在方法中实现MyBlock的行为主体,

代码如下:

- (void)viewDidLoad{    [super viewDidLoad];    UIButton *myButton=[UIButton buttonWithType:UIButtonTypeCustom];    [myButton setTitle:@"下一页" forState:UIControlStateNormal];    [myButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];    myButton.frame=CGRectMake(100, 400, 100, 50);    [myButton addTarget:self action:@selector(myButtonAction) forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:myButton];}-(void)myButtonAction{    //用自己写的方法实例化    FuZhuViewController *fuZhu=[[FuZhuViewController alloc]initWithBlock:^(NSString *str)    {        //这里接收到参数之后可以随意处理,也可以根据参数来处理本页面的UI        NSLog(@"值传过来了,是:%@,可以改变UI或者做其他操作",str);    }];    [self.navigationController pushViewController:fuZhu animated:NO];}

至此,基本就完成了整个过程,可能看上去有点麻烦,其实用起来非常方便,也很顺手。

0 0