iOS如何以编程方式简单地返回到先前呈现/推送的视图控制器?

时间:2016-08-03 10:53:43

标签: ios swift

如何以编程方式返回上一个视图控制器?我发现了这个answer,但有一个例子说明如果我们有导航堆栈怎么回去:

navigationController?.popViewControllerAnimated(true)

如果我的控制器队列基于导航控制器,那就没问题了。但通常我们使用故事板,我们指定标有关键字 Show 的segue,这意味着我们不关心导航推送或呈现新的视图控制器。所以在这种情况下,我假设只有通过segue的unwind视图控制器的选项,但也许有一些简单的调用,我可以通过编程方式返回到我以前的视图控制器,而不检查我的视图控制器堆栈是否包含{{1}或不。

我正在寻找像UINavigationController这样简单的东西。

2 个答案:

答案 0 :(得分:37)

您可以通过扩展轻松扩展任何内置类或任何其他类的功能。这是swift中扩展的完美用例。

你可以像这样扩展UIViewController并在任何UIViewController中使用 performSegueToReturnBack 函数

Swift 2.0

extension UIViewController {
    func performSegueToReturnBack()  {
        if let nav = self.navigationController {
            nav.popViewControllerAnimated(true)
        } else {
            self.dismissViewControllerAnimated(true, completion: nil)
        }
    }
}

Swift 3.0

extension UIViewController {
    func performSegueToReturnBack()  {
        if let nav = self.navigationController {
            nav.popViewController(animated: true)
        } else {
            self.dismiss(animated: true, completion: nil)
        }
    }
}

注意:

有人建议我们应该将_ = nav.popViewControllerAnimated(true)分配给一个未命名的变量,因为如果我们使用它而不分配任何内容,编译器就会抱怨。但我没有发现它。

答案 1 :(得分:4)

最佳答案是这样的: _ = navigationController?.popViewController(animated:true)

从这里采取:https://stackoverflow.com/a/28761084/2173368