如何关闭当前视图控制器和父视图控制器?

7
我将展示如何像这样呈现两个视图控制器:

我正在使用以下代码:

self.presentViewController(choosePlace, animated: true, completion: nil)
self.presentViewController(shareController, animated: true, completion: nil)

我希望你能帮我像这样解雇它们:

println("parent \(self.parentViewController)")
            self.dismissViewControllerAnimated(true, completion: {

            self.parentViewController?.dismissViewControllerAnimated(true, completion: nil)
            })

self.parentViewController总是为nil。如何同时dismiss两个视图控制器?


你尝试过只使用 self.parentViewController?.dismissViewControllerAnimated(true, completion: nil) 吗?我期望它会从父视图控制器中移除被呈现的视图控制器,进而移除在其后被呈现的每个视图控制器。或者当你打印它时,parentViewController 已经是 nil 了吗? - luk2302
问题是parentViewController似乎因某种原因为空..我应该在创建那个视图控制器时直接分配父级吗? - Tyler
现在,这应该是自动完成的...我不确定如果你连续呈现两个视图控制器会发生什么 - 视图层次结构会发生什么变化 - luk2302
你正在关闭视图控制器,然后变量被释放。创建一个指向它的指针,然后从该指针关闭父视图控制器。 - Scott
这个有效,谢谢@Scott - Tyler
显示剩余2条评论
4个回答

7
你可以:
self.dismissViewControllerAnimated(true, completion: { 
    self.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
})

因此,请确保按顺序显示您的视图控制器:

parentViewController -> choosePlace -> shareController

(箭头表示“self.presentViewController”)


1
无法工作。在应用程序获取呈现视图控制器(父视图控制器)之前,引用已经为空。 - zulkarnain shah

6

Swift 4

在尝试 Michael Voline 的答案时,我遇到了一些问题。

正如答案中的评论所述,它对我没有起作用。这是因为 presentingViewController 为空。因此,我们需要设置一个不同的属性,比如说 presentingController,但如果您在 viewDidLoad 上设置它,则无法正常工作。

private var presentingController: UIViewController?
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    presentingController = presentingViewController
}

那么

    dismiss(animated: false, completion: {
         self.presentingController?.dismiss(animated: false)
    })

我将动画设置为虚假,这样用户就不会在快速关闭时看到呈现视图控制器的UI界面。


经过几个小时的挣扎,我终于找到了这个并且解决了我的问题,非常感谢。 - Alejandro Luengo

3

在您的视图控制器中的“viewWillDisappear”函数期间,您可以引用呈现视图控制器(即ShareController在它离开范围之前解雇了choosePlace)。

//place the below in shareController 
override func viewWillDisappear(_ animated: Bool) {
    self.presentingViewController?.dismiss(animated: false, completion: nil)
}

在viewDidDisappear中引用presentingViewController是否有效? - Sam
此外,如果有特殊情况不想执行viewDidDisappear或viewWillDisappear中的代码,可以使用if语句。https://stackoverflow.com/questions/48380208/skip-swift-viewcontroller-main-functions-such-as-viewdiddisappear/48380302 - Sam

1
如果Michael Voline的解决方案无效,请尝试以下代码。
let customViewController = self.presentingViewController as? CustomViewController

self.dismiss(animated: true) {

   customViewController?.dismiss(animated: true, completion: nil)

}

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