一、什么是segue
- 每一个segue对象,都有三个属性
<1>唯一标识符
@property (nonatomic, readonly) NSString *identifier;
<2>来源控制器
@property (nonatomic, readonly) id sourceViewController;
<3>目标控制器
@property (nonatomic, readonly) id destinationViewController;
三、Segue的类型
根据segue的执行(跳转)时刻,Segue可以分为2大类型
- 自动型:点击某个控件后(比如按钮),自动执行Segue,自动完成跳转
- 手动型:需要通过写代码手动执行Segue,才能完成界面跳转
在恰当的时刻,使用perform方法执行对应的Segue
// Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用
[self performSegueWithIdentifier:@"login2contacts" sender:nil];
四、performSegueWithIdentifier:sender:方法的完整执行过程
// 这个self是来源控制器
[self performSegueWithIdentifier:@"login2contacts" sender:nil];
<1>根据identifier去storyboard中找到对应的线,新建UIStoryboardSegue对象
<1.1>设置Segue对象的sourceViewController(来源控制器)
<1.2>新建并且设置Segue对象的destinationViewController(目标控制器)
<2>调用sourceViewController的线面方法,做一些跳转前的准备工作并且传入创建好的Segue对象
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
// 这个sender是当初performSegueWithIdentifier:sender:中传入的sender
<3>调用Segue对象的- (void)perform;方法开始执行界面跳转操作
<3.1>如果Segue的style是push
- 取得sourceViewController所在的UINavigationController
- 调用UINavigationController的push方法将destinationViewController压入栈中,完成跳转
<3.2>如果Segue的style是modal
- 调用sourceViewController的presentViewController方法将destinationViewController展示出来
<4>Sender参数的传递
五、控制器的数据传递--控制器之间的数据传递主要有2种情况:顺传和逆传
<1>顺传
-
控制器的跳转方向: A → C
- 数据传递方向:A → C
- 数据的传递方式:在A的prepareForSegue:sender:方法中根据Segue参数取得destinationViewController,也就是控制器C,直接给控制器C传递参数(要在C的viewDidLoad方法中取得数据,来赋值给界面上的UI控件)
- 示例代码:
<逆传>
- 控制器的跳转方向:A → C
- 数据的传递方向:C → A
- 数据的传递方式:让A成为C的代理,在C中调用A的代理方法,通过代理方法的参数传递数据给A
- 代码示例
- 控制器C中:
- 控制器A中: