多控制器之间的传值
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>逆传 :下一级控制器传递给上一级控制器,用代理。上一级控制器作为下一级的代理,监听下一级控制器的事情。
2> set这时候控制器的 View 还没有加载,也就意味控制器里面的所有子控件都没有加载
3> 控制器之间的传值 , 给属性赋值要在 viewDidLoad 方法中
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 方法中