首先显示ViewController并解除

时间:2017-01-07 15:41:01

标签: ios swift

我有一个视图控制器" A"它以模态方式呈现另一个视图控制器B.

在故事板中,它看起来像这样:

UIViewController "A" -> UINavigationViewController "B" -> rootViewController" "C"

我的目标是呈现B并隐藏A,我该如何实现?

我尝试在C中设置属性并在那里解雇A,但它没有工作,因为我解雇了C并离开了A。

AViewController

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showSomething" {
            if let destination = segue.destination as? UINavigationController {
                if let viewController = destination.viewControllers.first as? CViewController {
                    viewController.delegate = self
                }
            }
        }
    }

CViewController

override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate.dismiss(animated: false)
    }

2 个答案:

答案 0 :(得分:0)

解除呈现视图控制器 - 也会自动解除其层次结构中呈现的视图控制器。

为了更清楚,让我们考虑您有三个ViewControllers:ABC A是根ViewController,他们看起来像:

A => B => C

假设当前呈现的ViewController是B,如果我做对了 - 你想同时提出C并解除B,正如我所提到的,解雇ViewController (在此示例中为B)导致解除其层次结构中的任何ViewController(在此示例中为C)。

如果您想要执行以下操作,可能不是您想要实现的目标:

A导航到BB导航到C,当解雇C时,我想转到A ,无需查看B

您需要让C ViewController执行此操作:

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

这导致取消当前呈现的CB} ViewController的呈现者,并直接返回A

有关此问题的详细信息,您可能需要查看this answer

希望这会有所帮助。

答案 1 :(得分:0)

你不能解雇A,因为它正在呈现C.你必须首先解雇A,然后使用呈现A的视图控制器来呈现C.像这样:

// call this from A
dismiss(animated: false) {
    // completion closure
    self.presentingViewController.present(cViewController, animated: true)
}

从我的手机回答,所以可能需要一些修复来编译。