iOS开发之控制器之间传值

    多个界面之间的跳转,免不了要进行数据传递,能够是顺向的,也能够是逆向的。android中activity之间数据传递是用startActivity(Intent)和startActivityForResult方式,逆向的时候在源activity中重写onActivityResult方法,在这个方法中获取传递过来的数据。iOS中能够利用UIStoryboardSegue顺向或者用代理、block逆向进行值传递。android

1、Segue方式:ide

    首先要知道Segue是什么,storyboard上每一条用来描述界面跳转的线,就是一个UIStoryboardSegue对象,简称Sugue。它有三个属性:atom

@property (nullable, nonatomic, copy, readonly) NSString *identifier;//segue的惟一标识
@property (nonatomic, readonly) __kindof UIViewController *sourceViewController;//源控制器
@property (nonatomic, readonly) __kindof UIViewController *destinationViewController;//目标控制器

根据Segue执行跳转的时刻,能够将其分为两种类型,自动和手动。自动类型是点击某个控件后,自动执行Segue完成界面跳转。手动类型是须要经过写代码来完成跳转。若是是手动类型,就须要给Segue设置一个identifier,而且在源控制器中执行这么一个方法:spa

[self performSegueWithIdentifier:@"identifier" sender:nil];

它内部的执行过程是这样的,建立segue->设置源控制器(segue.sourceViewController = self)->建立目的控制器,segue.destinationViewController = 目的控制器->[self prepareForSegue]跳转以前的准备操做->[segue perform]->判断下segue的类型,若是是push,拿到导航控制器push,[self.navigationController pushViewController:segue.destinationViewController animated:YES];代理

也就是说,在prepareForSegue方法中能够拿到目的控制器,天然就能够将数据传递到目的控制器了。这是顺向传递。code

逆向传递须要用代理的方式,A、B两个控制器,B在栈顶,如今B出栈要将数据传递给A,首先要在A跳转到B时让A成为B的代理,遵照代理协议,B在须要传数据的地方通知代理来处理时间并将数据扔给代理,意思就是B对A说这事我就交给你来作了,你要的东西我给你,你去作。这时候A实现代理协议中的方法,就拿到了B传过来的数据。orm

A控制器:对象

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    //A拿到B控制器,成为B的代理
    BViewController *BVC = segue.destinationViewController;
    BVC.delegate = self;
    
}

B控制器:
it

    //在处理返回逻辑的方法中
    
    //准备好要传递的数据
    
    //通知代理
    if ([_delegate respondsToSelector:@selector(代理方法)]) {
        [_delegate 代理方法(将数据当作参数)];
    }
    
    //返回到A控制器
    [self.navigationController popViewControllerAnimated:YES];

最后在A控制器中实现代理方法,就能获取到B传递的数据了。io


2、block方式:

如今B控制器中定义一个block属性

typedef 返回类型(^block别名)(参数);

//别名通常是类名+Block
@property(nonatomic, strong) block别名 block;

在A控制器中执行跳转的时候咱们拿到了B控制器,在B控制器的block属性中将要执行的操做代码先保存起来

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    
    BController *BVC = segue.destinationViewController;
    
    BVC.block = ^(参数){
        //TODO:未来要进行的操做
        //实际上这里的参数就是block传递过来的数据,咱们拿到这个参数就能够进行咱们想要作的事情了。逆向传参就完成了
    };
    
}

当返回上一个控制器以前,要让block帮咱们完成某些事情

if (_block) {
    _block(传递的数据);
}
相关文章
相关标签/搜索