iOS UIKit:viewController之Segues (4)

       可以使用Segues来定义app交互接口,在storyboard中用一个Segues来定义两个view controller之间的转换。Segues的起始点可以是 buttontable row,或 gesture recognizer,而Segues的终止点是相应显示的view controller。可以使用Segues端出(present)一个新的view controller,也可以使用unwind segue来清除view controller。

图 37 A segue between two view controllers

      开发工程师不需要通过程序来触发segue ,在运行时,UIKit会加载segue相关的view controller并连接相关的元素。当用户点击相关元素时,UIKit会自动加载合适的view controller,并通知app相应的segue 发生触发。

1 创建

       在同一个storyboard文件中创建view controller之间的segue,是非常简单的。首先按住Control键,同时拖拉第一个view controller到目标view controller,其中segue起始点必须是一个view或者是拥有响应方法的对象,如图 38所示。

图 38 Creating the segue relationship

      当释放鼠标左键时,Interface Builder会弹出一个窗口,让选择两个 view controller之间的segue类型,如图 39所示。其中segue类型如表 31所示。

 

图 39 Selecting the type of segue to create

表 31 Adaptive segue types

Segue type 

Behavior 

Show (Push) 

这种类型是使用目标view controller的 showViewController:sender:方法来展示新的内容。对于多数view controller,这种类型会弹出新的modal内容来覆盖原始的view controller;对于少数view controller会重载该方法来实现不同的行为,比如navigation controller会将新的view controller压入栈顶。

Show Detail (Replace) 

这种类型是使用目标view controller的 showDetailViewController:sender: 方法来展示新的内容。这种类型相当是将view controller潜入UISplitViewController 对象中。使用这种类型segue,split view controller 会用一个新view controller替换第二个子view controller。

Present Modally 

这种类型segue以modal形式展示view controller,新的场景完全盖住了旧的那个。用户无法再与上一个场景交互,除非先关闭这个场景。

Present as Popover 

在水平regular环境下,view controller会以popover形式出现;在水平compact环境下,view controller会以full-screen形式显示。

      在创建segue后,可以在attributes inspector中设置segue对象的identifier。在segue中,可以使用identifier来识别哪个segue被触发,若是在支持多segue的view controller中特别有用。当segue被执行时,identifier会随 UIStoryboardSegue对象传递给view controller。

2 修改

      UIKit提供一些支持,让工程师在segue运行期可修改segue的行为,如图 310所示是当segue触发时发生的动作,多数工作是在原(presenting)view controller中发生,其负责管理新view controller的转换。

 

图 310 Displaying a view controller using a segue

      在执行segue时,UIKit会调用current view controller的如下方法,从而有机会来影响segue的输出。

      1) shouldPerformSegueWithIdentifier:sender方法

      该方法给工程师机会来阻止segue的发生,当该方法返回NO时,将导致segue返回失败;但不能阻止其它响应方法的触发。比如,点击table row时仍然触发table相关的delegete方法;

      2) prepareForSegue:sender方法

      该方法属于原view controller的方法,通过这个方法可以将数据从原view controller传递给目标view controller。该方法的 UIStoryboardSegue包含有目标view controller的引用,并且还有其它一些相关信息。

3 清除

      Unwind Segue可以清除已经弹出的view controller。Unwind Segue也是一种segue,只不过它是segue的逆过程。可以通过Interface Builder窗口,创建Unwind Segue,其是在new view controller中的button、或其它合适对象链接到其Exit按钮中。从而当用户触发这个元素时,UIKit会在view controller层次结构中搜索能够处理Unwind Segue的对象;接着自动从new view controller返回到current view controller,并清理new view controller。

创建Unwind Segue的步骤是:可参考网上视频错误! 未找到引用源。

      1) 在原来正向segue的current view controller中声明一个Unwind Segue响应方法:

          如Object-c是:

- (IBAction)myUnwindAction:(UIStoryboardSegue*)unwindSegue

      2) 在原来正向segue的new view controller中,确定一个触发元素;按住control键,同时拖拉到本身new view controller视图的exit按钮;

      3) 在弹出的窗口中,选择current view controller中声明的方法。

图 311 create an unwind segue

注意:

     Unwind Segue可以应用于segue路径的逆过程,但不能没有segue的路径。如有A、B、C、D四个view controller,存在正向的segue路径有:AàBàC,D是孤立的,那么可以从C返回到B,也可以从C直接返回到A,但是不能从C返回到D。

4 程序触发

      一遍情况下,segue的触发是由用户的操作而启动的。也可以利用UIViewController的performSegueWithIdentifier:sender:方法在程序中手动触发segue,从而切换到其它的View controller。

-(void)performSegueWithIdentifier:(NSString*)identifier sender:(id)sender
    identifier:是segue在Interface Builder设置的标识;
    sender:其必须是segue存在的起始点,若不存在则无法转换。

      如下所示是手动从当前的view controller切换到其它view controller:

1 - (IBAction)performSegue:(id)sender {
2     [self performSegueWithIdentifier:@"thirdViewController" sender:self];
3 }

5 自定义

      Interface Builder提供一些标准的segue来实现从一个view controller转换到另一个view controller,然而有时不一定能满足要求,这时可用自定义segue来实现转换。

1) segue生命周期

      segue其实也是个实体对象,其是UIStoryboardSegue类或其子类的对象。在app中不需要直接创建它,当segue被触发时,UIKit会创建它们,其过程:

      a) 被弹出的view controller被创建和初始化;

      b) segue对象被创建,并调用其initWithIdentifier:source:destination: 方法

      c) 起始点的view controller内的prepareForSegue:sender: 方法会被调用;

      d) segue对象的 perform方法被调用;

      e) segue对象被释放。

2) 实现自定义segue

      为了自定义segue,需要继承UIStoryboardSegue,并实现如下方法:

       a) initWithIdentifier:source:destination方法: 该方法用于初始化segue;

       b) perform方法:该方法用于实现转换及动画。

如下所示:

1  - (void)perform {
2         // Add your own animation code here.
3      [[self sourceViewController] presentViewController:[self destinationViewController] animated:NO completion:nil];
4 }

 

posted @ 2016-05-04 19:09  xiuneng  阅读(799)  评论(0编辑  收藏  举报