首页 文章

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

提问于
浏览
557

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

展开segue可以允许转换到故事板中现有的场景实例

除了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 segue如何工作以及它们可以用于什么?

6 回答

  • 1240

    在果壳中

    unwind segue (有时称为 exit segue )可用于导航推送,模态或弹出窗口(就像您从导航栏弹出导航项,关闭弹出窗口或解除模态显示的视图控制器) . 除此之外,您实际上不仅可以通过一个推送/模态/弹出窗口来展开,例如, "go back"导航层次结构中的多个步骤,只有一个展开操作 .

    执行展开segue时,需要指定一个操作,该操作是要放松到的视图控制器的操作方法 .

    Objective-C的:

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

    迅速:

    @IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
    }
    

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

    iOS 8 update: Unwind segues也适用于iOS 8的自适应segue,例如Show和Show Detail .

    一个例子

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

    enter image description here

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

    Objective-C的:

    @implementation RedViewController
    
    - (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
    {
    }
    
    @end
    

    迅速:

    @IBAction func unwindToRed(segue: UIStoryboardSegue) {
    }
    

    添加操作方法后,您可以通过控制拖动到“退出”图标来定义故事板中的展开segue . 在这里,我们想要在按下按钮时从Green中解除Red:

    enter image description here

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

    enter image description here

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

    在执行展开segue之前,调用action方法 . 在示例中,我从Green和Blue中定义了一个展开为红色的segue . 我们可以通过UIStoryboardSegue参数访问action方法中的unwind源:

    Objective-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的黄色视图控制器,我们可以一步一步从黄色放松回到红色:

    enter image description here

    从代码中展开

    通过控制拖动某些东西到视图控制器的“退出”符号来定义展开segue时,文档大纲中会出现一个新的segue:

    enter image description here

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

    enter image description here

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

    Objective-C的:

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

    迅速:

    performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
    
  • 22

    至于如何在StoryBoard中使用展开segue ...

    Step 1)

    转到您希望 unwind to 的视图控制器的代码并添加:

    Objective-C的

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

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

    迅速

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

    Step 2)

    在故事板中,转到要放松的视图,只需将按钮中的segue拖动到源视图右上角的小橙色“EXIT”图标即可 .

    enter image description here

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

    就是这样,当您点击按钮时,您的segue将会放松 .

  • 29

    展开segue用于“返回”某个视图控制器,通过多个segues,您可以从中获取“当前”视图控制器 .

    想象一下,你有 MyNavControllerA 作为其根视图控制器 . 现在你使用push segue来 B . 现在导航控制器的 viewControllers 数组中有A和B,B是可见的 . 现在你以模态方式呈现 C .

    使用展开segues,您现在可以将 CC 展开到 B (即解除模态显示的视图控制器),基本上是"undoing"模态segue . 您甚至可以一直放松回到根视图控制器 A ,同时撤消模态segue和push segue .

    展开segues可以轻松回溯 . 例如,在iOS 6之前,解除显示的视图控制器的最佳做法是set the presenting view controller as the presented view controller’s delegate, then call your custom delegate method, which then dismisses the presentedViewController . 听起来既麻烦又复杂?它是 . 这就是为什么放松segues不错 .

  • 1

    我没有知道最初的segue起源于哪里,对我来说这是一个更重要的用例 . 例如,假设您有一个帮助视图控制器( H ),您可以从两个不同的视图控制器( AB )以模态方式显示:

    AH
    BH

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

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

    这样,展开将找到任何视图控制器( AB )启动segue并返回到它 .

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

  • 44

    Swift iOS:

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

    //pragma mark - Unwind Seques
    @IBAction func goToSideMenu(segue: UIStoryboardSegue) {
    
        println("Called goToSideMenu: unwind action")
    
    }
    

    第2步:( StoryBoard)右键单击你的SLAVE / CHILD EXIT按钮并选择“goToSideMenu”作为连接你的动作按钮,你将点击该按钮返回给你MASTER控制器视图:

    enter image description here
    第3步:构建并运行...

  • 160

    例如,如果从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(您需要将Exit按钮连接到VC的退出图标并将其连接到unwindseague:

    enter image description here

    • Unwind Seague已完成 - > ViewControllerA的TextLabel已更改 .

    enter image description here

相关问题