我有一个视图控制器" 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)
}
答案 0 :(得分:0)
解除呈现视图控制器 - 也会自动解除其层次结构中呈现的视图控制器。
为了更清楚,让我们考虑您有三个ViewControllers:A
,B
和C
A
是根ViewController,他们看起来像:
A => B => C
假设当前呈现的ViewController是B
,如果我做对了 - 你想同时提出C
并解除B
,正如我所提到的,解雇ViewController (在此示例中为B
)导致解除其层次结构中的任何ViewController(在此示例中为C
)。
如果您想要执行以下操作,可能不是您想要实现的目标:
从A
导航到B
,B
导航到C
,当解雇C
时,我想转到A
,无需查看B
。
您需要让C
ViewController执行此操作:
presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)
这导致取消当前呈现的C
(B
} 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)
}
从我的手机回答,所以可能需要一些修复来编译。