ViewController编程指南展示和过渡-使用Segues

使用segues定义应用程序接口的流程。 segue定义了应用程序storyboard文件中两个视图控制器之间的转换。 segue的起始点是启动segue的按钮,表行或手势识别器。 segue的结束点是要显示的视图控制器。 segue总是呈现一个新的视图控制器,但是您也可以使用展开segue来关闭视图控制器。

图9-1两个视图控制器之间的隔离

segue_defined_2x.png

您不需要以编程方式触发segue。在运行时,UIKit加载与视图控制器相关联的段,并将它们连接到相应的元素。当用户与元素交互时,UIKit加载相应的视图控制器,通知应用程序segue即将发生,并执行转换。您可以使用UIKit发送的通知将数据传递到新的视图控制器或防止segue完全发生。

在视图控制器之间创建Segue

要在同一故事板文件中的视图控制器之间创建segue,请按住Control并单击第一个视图控制器中的相应元素并拖动到目标视图控制器。 segue的起始点必须是具有定义操作的视图或对象,例如控件,bar按钮项或手势识别器。您还可以从基于单元格的视图(如表和集合视图)创建segue。图9-2显示了在轻击表行时显示新视图控制器的segue的创建。

图9-2创建segue关系

segue_creating_2x.png

注意

一些元素支持多个段。例如,表行允许您为行的附件按钮中的水龙头配置不同的段,并
在该行的其余部分中轻敲。

当释放鼠标按钮时,Interface Builder会提示您选择要在两个视图控制器之间创建的关系类型,如图9-3所示。选择与所需转换相对应的segue。

图9-3选择要创建的segue类型

VCPG_displaying-view-controller-using-segue_9-4_2x.png

当选择您的segue的关系类型时,尽可能选择自适应segue。自适应段根据当前环境自动调整其行为。例如,显示segue的行为基于呈现视图控制器而改变。针对必须也在iOS 7上运行的应用程序提供了非适应段,这不支持自适应segues。图9-1列出了自适应segues及其在应用程序中的行为。

表9-1自适应segue类型

Segue 类型 行为
Show (Push) 此segue使用目标视图控制器的showViewController:sender:方法显示新内容。对于大多数视图控制器,此segue在源视图控制器上以模态方式呈现新内容。一些视图控制器专门覆盖方法并使用它来实现不同的行为。例如,导航控制器将新的视图控制器推送到其导航堆栈上。UIKit使用targetViewControllerForAction:sender:方法来定位源视图控制器。
Show Detail (Replace) 此segue使用目标视图控制器的showDetailViewController:sender:方法显示新内容。此segue仅与嵌入在UISplitViewController对象内的视图控制器相关。使用该segue,分割视图控制器用新的内容替换其第二子视图控制器(详细控制器)。大多数其他视图控制器以模态方式呈现新内容。UIKit使用targetViewControllerForAction:sender:方法来定位源视图控制器。
Present Modally 此segue使用指定的呈现和转换样式以模态方式显示视图控制器。定义适当的呈现上下文的视图控制器处理实际呈现。
Present as Popover 在水平标准环境中,视图控制器显示在弹出框中。在水平紧凑的环境中,使用全屏模态呈现显示视图控制器。

创建segue后,选择segue对象并使用attributes检查器为其分配一个标识符。在segue期间,您可以使用标识符确定触发了哪个segue,如果您的视图控制器支持多个segue,这是非常有用的。标识符包含在执行segue时传递到视图控制器的UIStoryboardSegue对象中。

在运行时修改Segue的行为

图9-4显示了触发segue时发生的情况。大多数工作发生在呈现视图控制器中,它管理到新的视图控制器的转换。新视图控制器的配置基本上与您自己创建视图控制器并显示它时的过程相同。因为segues是从storyboard配置的,所以segue中涉及的两个视图控制器必须在同一故事板中。

图9-4使用segue显示视图控制器

在segue期间,UIKit调用当前视图控制器的方法,给你机会影响segue的结果。

  • shouldPerformSegueWithIdentifier:sender:方法为您提供了防止segue发生的机会。从此方法返回NO会导致segue静默失败,但不会阻止其他操作发生。例如,表行中的点击仍然导致表调用任何相关的委托方法。
  • 源视图控制器的prepareForSegue:sender:方法允许您将数据从源视图控制器传递到目标视图控制器。传递给方法的UIStoryboardSegue对象包含对目标视图控制器的引用以及其他与segue相关的信息。

创建反顺序

反绕顺序允许您关闭已显示的视图控制器。通过将按钮或其他合适的对象链接到当前视图控制器的Exit对象,可以在Interface Builder中创建展开segue。当用户点击按钮或与适当的对象交互时,UIKit在视图控制器层次结构中搜索能够处理展开序列的对象。然后它关闭当前视图控制器和任何中间视图控制器以显示展开序列的目标。

创建展开序列
  1. 选择应显示在展开序列末尾的屏幕上的视图控制器。

  2. 在您选择的视图控制器上定义展开操作方法。

    此方法的Swift语法如下:

     @IBAction func myUnwindAction(unwindSegue: UIStoryboardSegue)
    

    此方法的Objective-C语法如下:

    - (IBAction)myUnwindAction:(UIStoryboardSegue*)unwindSegue
    
  3. 导航到启动放松操作的视图控制器。

  4. 按住Control键点击应该启动展开序列的按钮(或其他对象)。此元素应该在要关闭的视图控制器中。

  5. 拖动到视图控制器场景顶部的Exit对象。

segue_unwind_linking_2x.png
  1. 从关系面板中选择展开操作方法。

在尝试在Interface Builder中创建相应的展开segue之前,必须在其中一个视图控制器中定义一个展开操作方法。该方法的存在是必需的,并告诉Interface Builder有一个有效的目标为解开segue。

使用展开操作方法的实现来执行特定于您的应用程序的任何任务。你不需要自己解开涉及segue的任何视图控制器; UIKit为你做。相反,使用segue对象提取正在关闭的视图控制器,以便您可以从中检索数据。您还可以在展开segue完成之前使用unwind操作更新当前的视图控制器。

以编程方式启动Segue

Segues通常是触发的,因为你在故事板文件中创建的连接。但是,有时可能无法在故事板中创建段,也许是因为目标视图控制器尚未知晓。例如,游戏应用可以根据游戏的结果转变到不同的屏幕。在这些情况下,您可以使用当前视图控制器的performSegueWithIdentifier:sender:方法从代码中以编程方式触发segue。

代码清单9-1展示了一个segue,当从纵向旋转到横向时,它提供了一个特定的视图控制器。因为在这种情况下通知对象没有提供用于执行segue命令的有用信息,所以视图控制器将其自身指定为segue的发送者。

代码清单9-1以编程方式触发segue

- (void)orientationChanged:(NSNotification *)notification {
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
             !isShowingLandscapeView) {
        [self performSegueWithIdentifier:@"DisplayAlternateView" sender:self];
        isShowingLandscapeView = YES;
    }
// Remainder of example omitted.
}

自定义Segue

Interface Builder提供了从一个视图控制器转换到另一个视图控制器的所有标准方法(从呈现视图控制器到在弹出框中显示控制器)的顺序。但是,如果这些段中的一个没有做你想要的,你可以创建一个自定义segue。

Segue的生命周期

要理解自定义segue如何工作,您需要了解segue对象的生命周期。 Segue对象是UIStoryboardSegue类或其子类之一的实例。您的应用程序从不直接创建segue对象; UIKit在触发segue时创建它们。下面是发生了什么:

  1. 创建并初始化要呈现的视图控制器。
  2. 将创建segue对象,并调用其initWithIdentifier:source:destination:方法。标识符是您在Interface Builder中为segue提供的唯一字符串,另外两个参数表示转换中的两个控制器对象。
  3. 将调用呈现视图控制器的prepareForSegue:sender:方法。请参阅在运行时修改段的行为。
  4. segue对象的perform方法被调用。此方法执行转换以使新的视图控制器在屏幕上。
  5. 释放对segue对象的引用。

实现自定义Segue

要实现自定义segue,子类UIStoryboardSegue并实现以下方法:

  • 覆盖initWithIdentifier:source:destination:方法,并使用它来初始化您的自定义segue对象。始终先调用super。
  • 实现perform方法并使用它来配置您的过渡动画。

注意

如果实现添加了配置segue的属性,则无法在Interface Builder中配置这些属
性。相反,在触发segue的源视图控制器的prepareForSegue:sender:方法中
配置自定义segue的其他属性。

代码清单9-2显示了一个非常简单的自定义segue。这个例子只是呈现目的地视图控制器没有任何类型的动画,但你可以扩展这个想法与你自己的动画,如有必要。

代码清单9-2自定义segue

- (void)perform {
    // Add your own animation code here.
 
    [[self sourceViewController] presentViewController:[self destinationViewController] animated:NO completion:nil];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容