繁体   English   中英

什么是 Unwind segues 以及如何使用它们?

[英]What are Unwind segues for and how do you use them?

iOS 6 和 Xcode 4.5 有一个称为“Unwind Segue”的新功能:

Unwind segues 可以允许过渡到故事板中的现有场景实例

除了 Xcode 4.5 发行说明中的​​这个简短条目之外, UIViewController 现在似乎有几个新方法:

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier

unwind segues 是如何工作的以及它们的用途是什么?

简而言之

unwind segue (有时称为exit segue )可用于通过 push、modal 或 popover segue向后导航(就像您从导航栏中弹出导航项、关闭 popover 或关闭以模态呈现的视图控制器一样)。 最重要的是,您实际上不仅可以通过一个而是通过一系列推送/模态/弹出框来放松,例如,使用单个放松操作“返回”导航层次结构中的多个步骤。

当你执行一个unwind segue时,你需要指定一个action,它是你想要展开到的视图控制器的一个action方法。

目标-C:

- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}

迅速:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}

在故事板中创建展开转场时使用此操作方法的名称。 此外,该方法会在执行 unwind segue 之前调用。 您可以从传递的UIStoryboardSegue参数中获取源视图控制器,以与启动 segue 的视图控制器进行交互(例如,获取模态视图控制器的属性值)。 在这方面,该方法与UIViewControllerprepareForSegue:方法具有类似的功能。

iOS 8 更新: Unwind segues 也适用于 iOS 8 的自适应 segues,例如ShowShow Detail

一个例子

让我们有一个带有导航控制器和三个子视图控制器的故事板:

在此处输入图片说明

从绿色视图控制器,您可以展开(导航回)到红色视图控制器。 您可以从蓝色放松到绿色或通过绿色放松到红色。 要启用展开,您必须向 Red 和 Green 添加特殊操作方法,例如,这里是 Red 中的操作方法:

目标-C:

@implementation RedViewController

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}

@end

迅速:

@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}

添加 action 方法后,您可以通过按住 Control 拖动到 Exit 图标来定义故事板中的 unwind segue。 在这里,我们要在按下按钮时从绿色放松到红色:

在此处输入图片说明

您必须选择要展开的视图控制器中定义的操作:

在此处输入图片说明

您还可以从蓝色放松到红色(在导航堆栈中“两步之遥”)。 关键是选择正确的展开动作。

在执行 unwind segue 之前,将调用 action 方法。 在这个例子中,我定义了一个从绿色和蓝色到红色的展开转场。 我们可以通过 UIStoryboardSegue 参数访问 action 方法中的 unwind 源:

目标-C:

- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
    UIViewController* sourceViewController = unwindSegue.sourceViewController;

    if ([sourceViewController isKindOfClass:[BlueViewController class]])
    {
        NSLog(@"Coming from BLUE!");
    }
    else if ([sourceViewController isKindOfClass:[GreenViewController class]])
    {
        NSLog(@"Coming from GREEN!");
    }
}

迅速:

@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) {
    if let blueViewController = unwindSegue.sourceViewController as? BlueViewController {
        println("Coming from BLUE")
    }
    else if let redViewController = unwindSegue.sourceViewController as? RedViewController {
        println("Coming from RED")
    }
}

展开也可以通过推/模态segue 的组合来工作。 例如,如果我添加了另一个带有模态转场的黄色视图控制器,我们可以一步从黄色返回到红色:

在此处输入图片说明

从代码中解脱

当您通过控制拖动某些内容到视图控制器的退出符号来定义展开转场时,文档大纲中会出现一个新转场:

在此处输入图片说明

选择 segue 并转到 Attributes Inspector 会显示“标识符”属性。 使用它为您的 segue 提供唯一标识符:

在此处输入图片说明

在此之后,展开转场可以像任何其他转场一样从代码中执行:

目标-C:

[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];

迅速:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)

至于如何在 StoryBoard 中使用 unwind segues ......

第1步)

转到您希望展开的视图控制器的代码并添加以下内容:

目标-C

- (IBAction)unwindToViewControllerNameHere:(UIStoryboardSegue *)segue {
    //nothing goes here
}

请务必在 Obj-C 的 .h 文件中声明此方法

迅速

@IBAction func unwindToViewControllerNameHere(segue: UIStoryboardSegue) {
    //nothing goes here
}

第2步)

在情节提要中,转到您想要从中放松的视图,只需将一个 segue 从您的按钮或任何东西拖到源视图右上角的橙色小“退出”图标上即可。

在此处输入图片说明

现在应该有一个选项可以连接到“- unwindToViewControllerNameHere”

就是这样,当您的按钮被点击时,您的转场将会放松。

Unwind segues 用于“返回”到某个视图控制器,通过一些 segues,您可以从该视图控制器到达“当前”视图控制器。

想象一下,你有一个MyNavController其中A作为它的根视图控制器。 现在您对B使用 push segue 。 现在导航控制器的viewControllers数组中有 A 和 B,并且 B 是可见的。 现在您以模态呈现C

使用展开转场,您现在可以从CB展开“返回”(即解除模态呈现的视图控制器),基本上是“撤销”模态转场。 您甚至可以一直解压到根视图控制器A ,同时撤消模态转场和推送转场。

Unwind segues 使回溯变得容易。 例如,在 iOS 6 之前,关闭呈现的视图控制器的最佳实践是将呈现的视图控制器设置为呈现的视图控制器的委托,然后调用您的自定义委托方法,然后关闭呈现的视图控制器 听起来繁琐复杂? 它是。 这就是为什么 unwind segues 很好。

我在这里的其他答案中没有提到的是,当您不知道最初的 segue 起源于何处时如何处理展开,这对我来说是一个更重要的用例。 例如,假设您有一个帮助视图控制器( H ),您可以从两个不同的视图控制器( AB )模态显示:

AH
→H

如何设置 unwind segue 以便返回到正确的视图控制器? 答案是你在AB 中声明了一个同名的 unwind 动作,例如:

// put in AViewController.swift and BViewController.swift
@IBAction func unwindFromHelp(sender: UIStoryboardSegue) {
    // empty
}

这样,unwind 将找到启动 segue 的任何视图控制器( AB )并返回到它。

换句话说,将 unwind 动作视为描述 segue 的来源,而不是它要去的地方。

迅捷iOS:

步骤 1:将此方法定义到您的 MASTER 控制器视图中。 你想回去的地方:

//pragma mark - Unwind Seques
@IBAction func goToSideMenu(segue: UIStoryboardSegue) {

    println("Called goToSideMenu: unwind action")

}

第 2 步:(故事板)右键单击您的 SLAVE/CHILD EXIT 按钮并选择“goToSideMenu”作为连接您的操作按钮,您将点击该按钮返回到您的主控制器视图:

在此处输入图片说明 第 3 步:构建并运行...

例如,如果您从 viewControllerB 导航到 viewControllerA,那么在您的 viewControllerA 下面的委托将调用并且数据将共享。

@IBAction func unWindSeague (_ sender : UIStoryboardSegue) {
        if sender.source is ViewControllerB  {
            if let _ = sender.source as? ViewControllerB {
                self.textLabel.text = "Came from B = B->A , B exited"
            }
            
        }

}
  • Unwind Seague Source View Controller(您需要将退出按钮连接到 VC 的退出图标并将其连接到 unwindseague:

在此处输入图片说明

  • Unwind Seague Completed -> viewControllerA 的 TextLabel 已更改。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM