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

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

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

ViewController编程指南展示和过渡-使用Segues_第1张图片
segue_defined_2x.png

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

在视图控制器之间创建Segue

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

图9-2创建segue关系

ViewController编程指南展示和过渡-使用Segues_第2张图片
segue_creating_2x.png

注意

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

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

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

ViewController编程指南展示和过渡-使用Segues_第3张图片
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对象。

ViewController编程指南展示和过渡-使用Segues_第4张图片
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];
}

你可能感兴趣的:(ViewController编程指南展示和过渡-使用Segues)