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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何以编程方式执行Unwind segue?相关的知识,希望对你有一定的参考价值。

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

答案
  1. 创建手动segue(从文件所有者按Ctrl键拖动到退出),
  2. 在绿色EXIT按钮下方的左控制器菜单中选择它。

插入Segue名称以放松。

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

另一答案

SWIFT 4:

1.在想要放松的控制器内创建一个带有segue的@IBAction:

    @IBAction func unwindToVC(segue: UIStoryboardSegue) {

    }

2.在故事板中,从控制器中你想要从控制器中删除(展开)+从控制器符号拖动到退出符号并选择之前创建的方法:

enter image description here

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

enter image description here

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

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

这就是你要做的一切!

另一答案

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

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

// Objective C

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

    }

// Swift

 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

    }

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

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

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

//目标C.

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

//斯威夫特

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

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

另一答案

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

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

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

在代码中,

[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
另一答案

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

另一答案

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

Link to Technical Note

另一答案

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

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

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

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

另一答案

适用于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;
        }
    }
}
另一答案

Swift 4.2,Xcode 10+

对于那些想知道如何使用未通过故事板设置VC的人来说(那些来自搜索“`programmatically”+“unwind segue”的问题)。

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

navigationController?.popToRootViewController(animated: true)

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

另一答案

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

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

在override的类方法viewDidAppear中,如下所示:

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

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

如果将它放在viewDidLoad或viewWillAppear等其他ViewController方法中,它将被忽略。

以上是关于如何以编程方式执行Unwind segue?的主要内容,如果未能解决你的问题,请参考以下文章

在单元测试中以编程方式执行 Unwind Segue

无法以编程方式执行 unwind segue

Swift 以编程方式创建一个 unwind segue

在 unwind segue 之后执行 push segue

如何以编程方式从 TableView 执行 segue

如何在没有动画的情况下执行 unwind segue?