58-多控制器之间的传值

多控制器之间的传值

1.什么是Segue

Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称:Segue)

2.每一个Segue对象,都有3个属性
1>唯一标识
@property  ( nonatomic readonly NSString  *identifier;
2>来源控制器
@property  ( nonatomic readonly id  sourceViewController;
3>目标控制器
@property  ( nonatomic readonly id  destinationViewController;

图解三个属性:




3.根据Segue的执行(跳转)时刻,Segue可以分成两个类型
1>自动型: 点击某个控件后(比如按钮),自动完成界面跳转
2>手动型: 要通过写代码执行Segue,才可以完成跳转
3>自动型和手动型的Segue最大的区别
one:创建方式

自动型:在来源控制器的控件上向目标控制器拖线,选择push实现跳转
手动型:在来源控制器直接上向目标控制器拖线
two:使用场合
如果在跳转的时候满足一定条件后才跳转到下一个界面,建议使用手动型Segue

4>手动型Segue的实现
one> 手动型的Segue需要一个唯一标识


two ]]> 在恰当的时刻,使用performWithIdentitfier执行对应的Segue,实现跳转.
[
self  performSegueWithIdentifier: @"loginToContoent"  sender: nil ];
注意: self指来源控制器,Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用.

4.performSegueWithIdentifier方法底层
1> 根据唯一标识(loginToContent)去storyboard中寻找Segue,创建Segue对象
2> 设置Segue对象的sourceViewController(来源控制器),segue.sourceViewController = self;
3> 创建目的控制器对象,segue.destinationViewController = segue.destinationViewController(目的控制器对象)
4> 执行跳转,跳转之前,调用[self prepareForSegue:segue sender:nil],做一些准备工作和给要传的赋值。

5 .prepareForSegue方法
-( void )prepareForSegue:( UIStoryboardSegue  *)segue sender:( id )sender
{
    
/*
     
1>作用: 一般用来在跳转之前做一些准备工作,一般在这里给目的控制器的属性赋值
     
2>参数作用
     sender:是当初performSegueWithIdentifier:sender:中传入的sender
     destinationViewController:指的就是即将跳转的目的控制器(只能这样创建,不能使用alloc init,没意义)
     */

    
ContentViewController  *cVc=segue. destinationViewController ;
}

6.控制器传值的步骤
1> 目的控制器(接收方)必须要有一个属性接收数据
2> 来源控制器拿到目的控制器(接收方)对象,然后给目的控制器的属性赋值,就可以实现传值
注意:   在prepareForSegue方法中使用 segue. destinationViewController 就可以得到目标控制器

7.控制器传值的两种方式
1>顺传: 上一个控制器传值到下一个控制器
2>逆传: 下一个控制器,传值给上一个控制器

8>实现逆传的两种方式:
1>通过模型
one:步骤:
1.给目标控制器添加一个数据传递模型,并提供快速赋值的类方法
2.给来源控制器添加一个目标控制器的数据传递模型的属性,用于接收从目标控制器传过来的值,拿到目标控制器,用他的模型属性给自己的模型属性赋值。

two:那么问题来了
来源控制器怎么拿到目标控制器:在目标控制器跳转到来源控制器之前,给来源控制器的目标控制器属性赋值。

three:不用模型是因为他真的不行
1.不用这种方式逆传的原因是:类之间的耦合性太强,设计不好,两个控制器太依赖了
2.所以使用代理方式传值实现解耦.

2>通过代理
1:给下一级控制器添加一个代理,代理方法就是要做的事。
2.让上一级控制器成为下一级控制器的代理,实现下一级控制的代理方法,实现传值.
3.什么时候给下一级的代理赋值:在下一级控制器跳转到上一级控制器之前,给下一级的代理属性赋值。


3>逆传图解

 
9.总结控制器之间的传值
1>顺传: 上一级控制器传递给下一级控制器,直接能拿到下一级控制器,拿到之后,做什么事情都行。
2>逆传 :下一级控制器传递给上一级控制器,用代理。上一级控制器作为下一级的代理,监听下一级控制器的事情。

10.控制器之间传值不能使用使用模型属性的 set 方法重新给属性赋值
1> 控制器之间传值和控件之间传值不一样 , 控制器之间传值不能重写 set 方法
2> set这时候控制器的 View 还没有加载,也就意味控制器里面的所有子控件都没有加载
3> 控制器之间的传值 , 给属性赋值要在 viewDidLoad 方法中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值