1、Segue的需要了解的东西
什么是Segue
Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)
Segue的属性
每一个Segue对象,都有3个属性
// 唯一标识
@property (nonatomic, readonly) NSString *identifier;
// 来源控制器
@property (nonatomic, readonly) id sourceViewController;
// 目标控制器
@property (nonatomic, readonly) id destinationViewController;
示例图:
2、Segue的使用
Segue的类型
根据Segue的执行(跳转)时刻,Segue可以分为2大类型
自动型:点击某个控件后(比如按钮),自动执行Segue,自动完成界面跳转(按住Control键,直接从控件拖线到目标控制器)
手动型:需要通过写代码手动执行Segue,才能完成界面跳转
关于自动和手动的选择:
点击“控件”,不需要做任何判断,一定要跳转到下一个界面,建议使用“自动型Segue”。
点击“控件”后,需要做一些判断,也就是说:满足一定条件后才跳转到下一个界面,建议使用“手动型Segue”
( 手动的必须绑定一个标识,是通过标识来跳转的)
做基本的页面跳转
在恰当的时刻,使用perform方法执行对应的Segue
// Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用
[self performSegueWithIdentifier:@"login2contacts" sender:nil];
利用performSegueWithIdentifier:方法可以执行某个Segue,完成界面跳转。
这个方法内部实现细节
performSegueWithIdentifier:sender:
方法的完整执行过程
[self performSegueWithIdentifier:@“login2contacts” sender:nil];
// 这个self是来源控制器
1、根据identifier去storyboard中找到对应的线,新建UIStoryboardSegue对象
设置Segue对象的sourceViewController(来源控制器 segue.sourceViewController = self;)
新建并且设置Segue对象的destinationViewController(目标控制器)
2、调用sourceViewController的下面方法,做一些跳转前的准备工作并且传入创建好的Segue对象
// 这个sender是当初performSegueWithIdentifier:sender:中传入的sender
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;
3、调用Segue对象的
- (void)perform; 方法开始执行界面跳转操作
取得sourceViewController所在的UINavigationController
调用UINavigationController的push方法将destinationViewController压入栈中,完成跳转
3、关于控制的传值
控制器之间的数据传递主要有2种情况:顺传和逆传
顺传
控制器的跳转方向: A ——> C
数据的传递方向 : A ——> C
数据的传递方式 : 在A的prepareForSegue:sender:方法中根据segue参数取得destinationViewController, 也就是控制器C, 直接给控制器C传递数据
(要在C的viewDidLoad方法中取得数据,来赋值给界面上的UI控件)
逆传
控制器的跳转方向: A ——> C
数据的传递方向 : C <—— A
数据的传递方式 : 让A成为C的代理, 在C中调用A的代理方法,通过代理方法的参数传递数据给A
4、使用segue进行控制器之间的传值
我们在使用 segue 一个最重要的就是传值。
(这个是顺传数据)
// 这个方法是执行 segue 的时候,跳转之前调用这个方法
// 一般在这个方法里面做一些跳转之前的准备工作
// 使用segue 的时候,我们一般是使用这个方法来传值
// 实现在来源控制器里面就可以了
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// segue 就是一个桥梁,通过segue 可以拿到来源控制器和目标控制器。
UIViewController *vc = segue.destinationViewController;
vc.navigationItem.title = @"这个是跳转的目标控制器";
}
注意:
我们可以通过vc 的属性设值,就可以达到传值的目的(最好的是给vc的模型数组传值)
这个事目标控制器的效果:
5、使用代理进行控制器之间的逆向传值
//
// UIStoryboardSegue.h
// UIKit
//
// Copyright 2011-2012 Apple Inc. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKitDefines.h>
@class UIViewController;
NS_CLASS_AVAILABLE_IOS(5_0) @interface UIStoryboardSegue : NSObject
// Convenience constructor for returning a segue that performs a handler block in its -perform method.
+ (instancetype)segueWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(UIViewController *)destination performHandler:(void (^)(void))performHandler NS_AVAILABLE_IOS(6_0);
- (instancetype)initWithIdentifier:(NSString *)identifier source:(UIViewController *)source destination:(UIViewController *)destination; // Designated initializer
@property (nonatomic, readonly) NSString *identifier;
@property (nonatomic, readonly) id sourceViewController;
@property (nonatomic, readonly) id destinationViewController;
- (void)perform;
@end