iOS如何通过编程简单返回到上一个已呈现/推送的视图控制器?

15

如何以编程方式返回到上一个视图控制器?我在这里找到了这个答案,但是其中有一个示例演示了如何在具有导航堆栈的情况下返回:

navigationController?.popViewControllerAnimated(true)

对于基于导航控制器的控制器队列,我的情况还好。但通常我们使用故事板,在其中指定关键词为Show的转场,这意味着我们不关心导航推送或呈现新的视图控制器。因此在这种情况下,我认为只有通过segue取消视图控制器的选项,但也许有一些简单的调用可以编程式地返回到以前的视图控制器,而无需检查我的视图控制器堆栈是否包含 UINavigationController

我正在寻找类似self.performSegueToReturnBack的简单方法。


阅读有关 unwindSegue 的内容。 - Lu_
嗨 @Lu_ 是的,我在我的问题中提到了这个,我知道这种方法。但它需要在Storyboard中进行额外的设置。这不是一种编程方法。但当然这是一个解决方案。同意你的观点。 - Matrosov Oleksandr
所以在没有任何准备的情况下是无法做出任何东西的,必须付出一些努力 :) 如果你了解segues,你可以像前进一样制作segue返回。 - Lu_
@Lu_ 如果你看到这个话题:https://spin.atomicobject.com/2014/10/25/ios-unwind-segues/,我们将一些segue连接到退出。但是我通过编程方式创建了我的按钮,没有选项可以让我解开。 - Matrosov Oleksandr
2个回答

45

您可以通过扩展轻松地扩展任何内置类或任何其他类的功能。这是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)赋值给一个未命名的变量,因为如果我们在不给任何东西赋值的情况下使用它,编译器会抱怨。但是我并没有发现这样做有必要。


是的,这就是我在iOS SDK中期望看到的 =) 但我猜那里没有合适的方法。谢谢,我想这暂时是一个解决方案。 - Matrosov Oleksandr
这对我没有用,因为我有模态呈现的视图控制器返回了一个导航控制器 - 需要被解除而不是弹出。它默默地失败了。 - AmitaiB
所以我猜你是想从第一个视图控制器中解除导航控制器。在这种情况下,你可以使用self.navigationController.performsegueToReturenBack()。 - Prajeet Shrestha
如果OP需要一种“不可知论”的方法返回到上一个视图控制器,那么我们需要检测我们的VC是如何呈现的:模态/显示。如果是这样,navigationController != nil !=以模态方式呈现,因为根据文档它返回:“_在视图控制器层次结构中最近的祖先导航控制器_”。如果NavVC → ParentVC以编程方式模态呈现,则navigationController即使是模态的并且需要dismiss而不是pop,也会返回.Some - AmitaiB
如果您能够分享控制器层次结构的图表,那么它将澄清事情。 - Prajeet Shrestha

4

5
只有在我们要解散嵌入在导航控制器中的视图控制器时,这才起作用,但并非始终如此。 - Prajeet Shrestha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接