如何在不关闭其他 UIViewController 的情况下关闭后台堆栈上的特定 UIViewController? (UIKit)

问题描述 投票:0回答:1

我有几个

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
原样。

ios swift uiviewcontroller uikit
1个回答
0
投票

ViewControllerA -> ViewControllerB -> ViewControllerC -> ViewControllerD

如果您使用

UINavigationController
push
操作,它就是一个堆栈。你有一个由 NavigationController 保存的视图控制器数组。

但是,在上面的场景中,您使用的是

present
而不是
push
,因为我在这里看到了
modalPresentationStyle
属性。基本上, presentViewController:animated:completion: 的工作方式不同。你可以想象
push
是一种水平层次,而
present
则是一种垂直层次。 UIKit 允许您一次在当前视图控制器上呈现一个视图控制器:

vcD vcC vcB vcA

您可以在这里简单地看到依赖关系,因为具有较高层的每个控制器都依赖于较低层的控制器。因此,每当你想要破坏一个

node
时,从该节点到末尾的所有节点也将被破坏。即,解雇
vcB
也解雇
vcC
vcD
。等等

© www.soinside.com 2019 - 2024. All rights reserved.