zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    使用yum时,保留下载包设置
    df命令
    Linux Shell脚本实现根据进程名杀死进程
    centos 清理内存缓存
    sgdisk常用操作
    CentOS7 bonding配置
    linux下显示dd命令的进度:
    OSD磁盘日常监控
    flashcache
    Elasticsearch request body检索
  • 原文地址:https://www.cnblogs.com/huliangwen/p/5459507.html
Copyright © 2011-2022 走看看