先来看下面的一副图:
这幅图展示了segue的类型:
Show
根据当前屏幕中的内容,在master area或者detail area中展示内容。
例如:如果app当前同时显示master和detail视图,内容将会压入detail区域。
如果app当前仅显示master或者detail视图,内容则压入当前视图控制器堆栈中的顶层视图。
Show Detail
在detail area中展现内容。
例如:即使app同时显示master和detail视图,那么内容将被压入detail区域
如果app当前仅显示Master或者detail视图,那么内容将替换当前视图控制器堆栈中的顶层视图。
Present Modally
使用模态展示内容。属性面板中提供presentation style (UIModalPresentationStyle)与 transition style (UIModalTransitionStyle)两种选项
Present as Popover
在某个现有视图中的锚点处使用弹出框展示内容。这个选项可指定显示在弹出框视图一边上的箭头可用方向,同时也是指定锚点视图的一个选项。
custom根据自己的需求,自定义segue
总结:对已iphone开发来说主要用到Show ,Present Modally,custom。show相当于push,NavigationController中的栈式跳转;Present Modally相当于Present,模态跳转。而Present Modally和Present as Popover主要用在iPad开发中。
1、跳转
程序员们只需要进行拖线就能搞定页面之间的跳转,记得给每个segue设置identifier,从而区别开始是哪一个segue:如下图
在红色ViewController的button上按住control键拖线到黄色ViewController,sugue的类型选择show,在黄色ViewController的button上按住control键拖线到粉红ViewController,sugue的类型选择present Modal;运行程序就能看到不同了。
2、返回
返回一般有两种方式:1、代码实现 ; 2、使用ViewController中的Exit结合-(IBAciton)XXX(UIStoryboarySegue *)segue函数来完成;
第一种代码实现如下:
show类型的segue:
- (void)backToUpperVc:(UIBarButtonItem *)barButtonItem
{
[self.navigationControllerpopViewControllerAnimated:YES];
}
present Modal类型的segue:
- (IBAction)backToYellow:(id)sender
{
[selfdismissViewControllerAnimated:YEScompletion:nil];
}
第二种使用ViewController中的Exit结合-(IBAciton)XXX(UIStoryboarySegue *)segue函数来完成;
假设从黄色ViewController返回到红色ViewController,步骤如下
(1)在红色ViewController里实现下面的方法:
- (IBAction)unWindSegue:(UIStoryboardSegue *)segue{}
注意点:1、返回值必须是IBAction,参数必须是UIStoryboardSegue,名字无所谓
2、此方法写在要返回的ViewController里
(2)当定义完上面的方法之后,对Storyboard操作如下:
右键点击红色ViewController的第三个按钮Exit,就会看到刚才定义的方法,然后拖线到黄色ViewController的Button控件上,就会看到action的提示,点击提示就完成了返回的操作。
3、传值
假设从红色ViewController传值到黄色ViewController
(1)在黄色ViewController里声明一个属性
@property (weak,nonatomic)NSString *str;
(2)在红色的ViewController里实现下面的方法
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifierisEqualToString:@"redToYellow"]) {
YellowViewController *yellowVC = segue.destinationViewController;
// [yellowVC setValue:@"传值成功" forKey:@"str"];
// [yellowVC setStr:@"传值成功"];
yellowVC.str =@"传值成功";
}
}
反向传值采用委托代理的方式实现,这里就不上代码了,具体实现请查阅资料
步骤如下:
(1)在主动方VC里声明协议代理方法和delegate
(2)在接收方VC里遵守协议并实现代理方法