我有几个
UIViewController
,我用 modalPresentationStyle = .fullScreen
以编程方式呈现。我的 UIViewController
堆栈看起来像这样:
ViewControllerA -> ViewControllerB -> ViewControllerC -> ViewControllerD
我想要做的是从 ViewControllerD 中解除 ViewControllerB (通过单击按钮),所以堆栈现在看起来像这样:
ViewControllerA -> ViewControllerC -> ViewControllerD
我尝试过的:
我尝试在 ViewControllerB 中注册一个
NotificationCenter
监听器,然后从 ViewControllerD 发布通知来关闭 ViewControllerB,但最终还是关闭了 ViewControllerD。
我尝试将所有
UIViewController
嵌套在 UINavigationController
中,并像这样在 ViewControllerD 中弹出 ViewControllerB:
if let viewController = navigationController?.viewControllers.first(where: {$0 is ViewControllerB}) {
navigationController?.popToViewController(viewController, animated: false)
}
但这最终也只是弹出 ViewControllerD。
我试过这个:
self.presentingViewController?.presentingViewController?.dismiss(animated: false, completion: nil)
但问题是你最终也放弃了 ViewControllerB 和 ViewControllerC。我想关闭 ViewControllerB 并保留其他
UIViewController
原样。
ViewControllerA -> ViewControllerB -> ViewControllerC -> ViewControllerD
如果您使用
UINavigationController
和 push
操作,它就是一个堆栈。你有一个由 NavigationController 保存的视图控制器数组。
但是,在上面的场景中,您使用的是
present
而不是 push
,因为我在这里看到了 modalPresentationStyle
属性。基本上, presentViewController:animated:completion: 的工作方式不同。你可以想象 push
是一种水平层次,而 present
则是一种垂直层次。 UIKit 允许您一次在当前视图控制器上呈现一个视图控制器:
vcD 上 vcC 上 vcB 上 vcA
您可以在这里简单地看到依赖关系,因为具有较高层的每个控制器都依赖于较低层的控制器。因此,每当你想要破坏一个
node
时,从该节点到末尾的所有节点也将被破坏。即,解雇 vcB
也解雇 vcC
和 vcD
。等等