320

使用情节提要非常容易。您只需将操作拖到“退出”即可。但是我应该如何从我的代码中调用它?

4

10 回答 10

293
  1. 创建手动转场(ctrl从文件所有者 -drag 到退出),
  2. 在绿色 EXIT 按钮下方的左侧控制器菜单中选择它。

在绿色退出按钮下方的左侧控制器菜单中选择它

插入 Segue 的名称以放松。

然后,- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.使用您的 segue 标识。

于 2012-11-03T11:49:35.217 回答
177

这是 Objective C 和 Swift 的完整答案:

IBAction1)在您的目标视图控制器(您想要转场的地方)中创建一个展开转场。实现文件中的任何位置。

// Objective C

    - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

2)在源视图控制器(您要从中选择的控制器)上,⌃ + 从“活动名称”拖动以退出。您应该会在弹出窗口中看到在步骤 1 中创建的展开转场。(如果您没有看到,请查看第一步)。从弹出窗口中选择 unwindToContainerVC: 或任何您命名的方法,以将源控制器连接到展开 IBAction。

在此处输入图像描述

3)在故事板的源视图控制器的文档大纲中选择segue(它将在底部附近列出),并给它一个标识符

在此处输入图像描述

4) 使用此方法从源视图控制器调用展开转场,替换您的展开转场名称。

// 目标 C

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

// 斯威夫特

self.performSegueWithIdentifier("unwindToContainerVC", sender: self)

注意。使用 unwind 方法上 segue 参数的 sourceViewController 属性来访问源控制器上的任何公开属性。另外,请注意框架处理解除源控制器。如果您想确认这一点,请向源控制器添加一个 dealloc 方法,其中包含一条日志消息,一旦它被杀死就应该触发。如果 dealloc 没有触发,您可能有一个保留周期。

于 2014-12-13T20:27:36.907 回答
89

bradleygriffith的回答很棒。为了简化,我采取了第 10 步并制作了屏幕截图。这是 Xcode 6 中的屏幕截图。

  1. 按住 Control 从橙色图标拖动到红色的退出图标以创建一个展开,视图中没有任何操作/按钮。

在此处输入图像描述

  1. 然后unwind segue在侧边栏中选择:

在此处输入图像描述

  1. 设置一个 Segue Identifier 字符串:

在此处输入图像描述

  1. 从代码访问该标识符:
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
于 2014-08-06T20:56:34.210 回答
14

我用[self dismissViewControllerAnimated: YES completion: nil];which 会让你回到通话ViewController中。

于 2012-11-04T23:02:28.030 回答
11

引用 Apple 关于 Unwind Segue 的技术说明中的文字:要添加只能以编程方式触发的展开 segue,请从场景的视图控制器图标中控制并拖动到其退出图标,然后从弹出菜单中为新的 segue 选择一个展开动作。

链接到技术说明

于 2013-11-06T19:21:11.370 回答
6

Vishal Chaudhry 上面的回答对我有用。我还要补充一点,以便使用以下方法手动触发序列:

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

在 ViewController 中,您还必须在情节提要中的 ViewController 场景下选择展开转场,并在 RHS 的属性视图中确保 Indentifier 字段包含您在代码中引用的名称(上例中的“mySegueName” )。

如果省略这一步,上面的行将抛出一个序列名称未知的异常。

于 2014-03-18T22:39:48.550 回答
3

向后兼容的解决方案适用于 ios6 之前的版本,适用于感兴趣的用户:

- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {

    for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
        UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
        if ([vc isKindOfClass:vcClass]) {
            [self.navigationController popToViewController:vc animated:animated];
            return;
        }
    }
}
于 2013-12-23T22:32:52.410 回答
3

斯威夫特 4

1.创建一个@IBAction,在你想放松的控制器内使用segue:

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2.在情节提要中,从您想要从控制器符号中切换(展开)的控制器中按 ctrl+从控制器符号拖动到退出符号并选择您之前创建的方法:

在此处输入图像描述

3.现在您可以注意到在文档大纲中您有标题为“Unwind segue...”的新行。现在你应该点击这一行并打开属性检查器来设置标识符(在我的例子中是 unwindSegueIdentifier)。

在此处输入图像描述

4.你快完成了!现在您需要打开您希望从中放松的视图控制器并创建一些将执行 segue 的方法。例如,您可以添加按钮,使用@IBAction将其与代码连接,然后在此IBAction中添加perfromSegue(withIdentifier:sender:)方法:

     @IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
         performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
     }

所以这就是你所要做的!

于 2018-09-10T09:44:07.877 回答
3

斯威夫特 4.2,Xcode 10+

对于那些想知道如何使用未通过情节提要设置的VC 来做到这一点的人(那些通过搜索“以编程方式”+“展开转场”来解决这个问题的人)。

鉴于您无法以编程方式设置展开转场,最简单的纯编程解决方案是调用:

navigationController?.popToRootViewController(animated: true)

这会将堆栈上的所有视图控制器弹出回您的根视图控制器。


要从导航堆栈中弹出最顶层的视图控制器,请使用:

navigationController?.popViewController(animated: true)

于 2019-04-02T11:48:42.723 回答
0

仅供参考:为了使@Vadim 的答案与从视图控制器中调用的手动展开序列操作一起工作,您必须放置命令:

[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];

在被覆盖的类方法viewDidAppear内部,如下所示:

-(void) viewDidAppear:(BOOL) animated
{
    [super viewDidAppear: animated];

    [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}

如果您将它放在其他 ViewController 方法中,例如viewDidLoadviewWillAppear,它将被忽略。

于 2013-04-19T20:13:34.687 回答