提问者:小点点

什么是放松段,你如何使用它们?


iOS 6和Xcode 4.5有一项新功能,称为“Unwind 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

展开段如何工作以及它们可以用于什么?


共3个答案

匿名用户

展开序列(有时称为退出序列)可用于通过推送、模式或popover序列向后导航(就像您从导航栏弹出导航项、关闭popover或解除模式显示的视图控制器)。除此之外,您实际上不仅可以通过一个,还可以通过一系列推送/模式/popover序列来展开,例如,在导航层次结构中通过单个展开操作“返回”多个步骤。

执行展开序列时,需要指定一个动作,这是要展开到的视图控制器的动作方法。

目标C:

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

迅速:

@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}

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

iOS8更新:展开segue也适用于iOS8的自适应segue,如Show和Show Detail。

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

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

目标C:

@implementation RedViewController

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

@end

迅速:

@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}

添加操作方法后,您可以通过控制拖动到退出图标来定义故事板中的展开segue。在这里,当按下按钮时,我们想从绿色展开到红色:

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

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

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

目标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:

选择segue并转到属性检查器会显示“标识符”属性。使用此选项为您的segue提供唯一标识符:

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

目标C:

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

迅速:

performSegueWithIdentifier("UnwindToRedSegueID", sender: self)

匿名用户

至于如何在情节提要中使用展开分段。。。

步骤1)

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

目标-C

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

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

敏捷的

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

步骤2)

在情节提要中,转到要从中展开的视图,只需从按钮或其他位置拖动一段,直到源代码视图右上角的小橙色“退出”图标。

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

就是这样,当你的按钮被点击时,你的音乐就会放松。

匿名用户

展开segue用于“返回”到一些视图控制器,从那里,通过一些segue,您可以到达“当前”视图控制器。

假设您有一个MyNavController,其中A作为其根视图控制器。现在,您可以使用推segue到B。现在导航控制器在其viewController数组中有A和B,并且B可见。现在,您将模块化地呈现C

使用展开段,您现在可以从C展开“后退”到B(即,解除模态显示视图控制器),基本上“撤消”模态段。您甚至可以一直放回到根视图控制器A,撤消模式序列和推送序列。

松开segue使它很容易回溯。例如,在iOS6之前,取消呈现视图控制器的最佳实践是将呈现视图控制器设置为呈现视图控制器的委托,然后调用自定义委托方法,然后该方法将取消呈现视图控制器。听起来笨重复杂?是的。这就是为什么放松赛格很好。