一旦下一个视图控制器模态出现,就closures或删除先前的模态控制视图控制器
我的目标包括很多视图需要基于每个用户操作呈现不同的视图模式。 在这里我想要做的是获得更干净的视图层次结构和更好的用户体验。
- 根视图控制器模态地呈现第一视图控制器
- 当我点击第一个视图控制器上的button时,第二个视图控制器出现在模态上。
- 一旦第二个视图控制器确实出现,我想消除或从视图层次结构中删除第一个。
我可以这样做吗? 如果是这样 ,我该怎么做呢?
如果没有 ,解决这个问题的正确方法是什么,因为我将在每个视图上呈现许多模态提供的视图控制器。 我认为,即使我想解散当前的观点,当前一个解散的时候,前一个仍然会出现。
更新:
VC1(根)> VC2(模态地存在)> VC3(它在 VC2上模态存在)
当我解雇VC3
, VC2
仍在观看记忆中。 所以,我不想在我解雇VC3
出现VC2
,而是想通过从视图层次结构中删除或解散VC2
来查看VC1
。
WANT :在图像上,当我解开蓝色的时候,我不想看到我的视觉记忆中的粉红色,并且我想在蓝色眼睛出现的时候立即将其删除。
这就是我想要做的。
任何帮助?谢谢。
所以,我们假设你有一个类似于以下内容的故事板:
应该发生什么是:
- 介绍第二个ViewController(从第一个ViewController)。
- 呈现第三个ViewController(从第二个ViewController)。
- 解散到第一个ViewController(从第三个ViewController)。
在第三个ViewControllerbutton的操作中:
@IBAction func tapped(_ sender: Any) { presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil) }
正如你所看到的,通过访问当前ViewController的presentsViewController,你可以closures视图控制器的前一个层次结构:
呈现这个视图控制器的视图控制器。
通过实现presentingViewController?.presentingViewController?
那意味着:呈现的当前ViewController 🙂
这看起来有点混乱,但很简单。
所以输出应该是(我添加到viewControllers的背景颜色 – 作为vc1:橙色,vc2:黑色和vc3:浅橙色,使其显示清晰):
编辑:
如果你要求删除中间的ViewController(在这个例子中是第二个ViewController),那么dismiss(animated:completion :)会自动完成这个操作:
如果您连续呈现多个视图控制器,从而构build呈现的视图控制器堆栈,则在堆栈中较低视图控制器上调用此方法将取消其立即子视图控制器以及该堆栈上的该子视图之上的所有视图控制器。 当发生这种情况时,只有最顶层的观点才会以animation的方式被驳回。 任何中间视图控制器都可以简单地从堆栈中移除。 最顶层的视图使用其模式转换样式,这可能不同于其他视图控制器在栈中使用的样式。
谈到你在问什么:
我认为,即使我想解散当前的观点,当前一个解散的时候,前一个仍然会出现。
我认为这在用户界面上看起来很清楚(我觉得可以),但正如在dismiss
文档讨论中提到的那样,第三和第二个都会从堆栈中删除。 这是正确的方法。
希望它有帮助。
这是我的观点,从不同的angular度来看,
- 根视图控制器呈现第二视图控制器
- 将FirstView添加到第二个视图
- 按下button时closuresFirstView控制器。
第二视图控制器,
class ViewController: UIViewController, FirstViewControllerProtocol { weak var firstViewController: FirstViewController? override func viewDidLoad() { super.viewDidLoad() print("Not initiated: \(firstViewController)") firstViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "FirstViewController") as? FirstViewController addChildViewController(firstVC!) firstViewController?.delegate = self view.addSubview((firstViewController?.view)!) print("Initiated: \(firstViewController)") } func dismiss() { firstViewController?.view.removeFromSuperview() firstViewController?.removeFromParentViewController() } }
FirstViewController,
protocol FirstViewControllerProtocol { // Use protocol/delegate to communicate within two view controllers func dismiss() } class FirstViewController: UIViewController { var delegate: FirstViewControllerProtocol? override func viewDidLoad() { super.viewDidLoad() } @IBAction func dismiss(_ sender: Any) { delegate?.dismiss() } deinit { print("BYE") } }