如何以编程方式执行Unwind segue?

时间:2012-09-20 09:07:53

标签: ios segue ios6

使用故事板这很容易。您只需将操作拖动到“退出”即可。但是我应该如何从我的代码中调用它呢?

10 个答案:

答案 0 :(得分:275)

  1. 创建手动segue( ctrl -drag从文件所有者到退出),
  2. 在绿色退出按钮下面的左控制器菜单中选择它。
  3. Choose it in the Left Controller Menu below green EXIT button

    插入Segue名称以放松。

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

答案 1 :(得分:155)

以下是Objective C和Swift的完整答案:

1)在目标视图控制器中创建IBAction展开segue(您想要转到的位置)。实施文件中的任何位置。

// Objective C

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

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

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

enter image description here

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

enter image description here

4)使用此方法从 source 视图控制器调用unwind segue,替换unwind segue名称。

//目标C

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

// Swift

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

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

答案 2 :(得分:74)

bradleygriffith答案很棒。我采取了步骤10,并进行了简化截图。这是Xcode 6中的屏幕截图。

简单控制 - 从橙色图标拖动到红色“退出”图标,以在视图中创建一个没有任何操作/按钮的展开。

enter image description here

然后选择unwind segue并设置一些标识符以从代码中访问它。

enter image description here

在代码中,

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

答案 3 :(得分:13)

我使用了[self dismissViewControllerAnimated: YES completion: nil];,它会让您回到调用ViewController

答案 4 :(得分:11)

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

Link to Technical Note

答案 5 :(得分:6)

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

[self performSegueWithIdentifier:@"mySegueName" sender:self];
从ViewController中

你还必须在故事板中的ViewController的Scene下选择unwind segue,并在RHS的属性视图中确保Indentifier字段包含你在代码中引用的名字(“mySegueName”in上面的例子。)

如果省略此步骤,上面的行将抛出一个异常,即seque名称未知。

答案 6 :(得分: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;
        }
    }
}

答案 7 :(得分:1)

Swift 4.2,Xcode 10 +

对于那些想知道如何使用VC而不是通过故事板进行设置的人(那些通过“以编程方式”搜索“ +放松搜索”来解决此问题的人)。 >

鉴于您无法以编程方式设置取消同步,最简单的单一编程解决方案是调用:

navigationController?.popToRootViewController(animated: true)

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

答案 8 :(得分:0)

仅供参考:为了让@Vadim回答使用从View Controller中调用的手动展开式seque动作,你必须放置命令:

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

覆盖类方法 viewDidAppear 内部如下:

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

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

如果您将其放在其他ViewController方法中,例如 viewDidLoad viewWillAppear ,则会忽略它。

答案 9 :(得分:0)

SWIFT 4

1。。创建一个 @IBAction ,其中包含要在其中展开的控制器内部的segue:

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2。。在情节提要中,您想从控制器中按ctrl键(展开)(从控件中拖动)以退出标志并选择您之前创建的方法:

enter image description here

3。。现在您可以注意到,在文档大纲中,新行的标题为“ Unwind segue ....”。现在,您应该单击此行并打开属性检查器以设置标识符(在我的情况下为 unwindSegueIdentifier )。

enter image description here

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

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

这就是您要做的一切!