如何同时呈现两个视图控制器?

How to simultaneously present two view controllers?

我的目标是呈现一个视图控制器而不直接关闭它 presentingViewController

为了更清楚,请考虑以下示例:

指的是这个故事板:

假设第一个黑色视图控制器是第一个(初始)视图控制器,它应该呈现第三个白色视图控制器;问题是白色视图控制器应该解散到第二个橙色视图控制器但不是黑色视图控制器,所以它应该表现得像:

如何应用这种行为?

备注:没有导航控制器,应该是present/dismiss,不是push/pop。

您可以将导航控制器附加到第一个控制器。然后单击第一个视图控制器,您可以使用此代码

按您想要的任何顺序设置所有视图控制器
   var viewControllers = self.navigationController.viewControllers.mutable
   / * Now you can append the other 2 controllers to this array */
      viewControllers.append(yellowVC);
      viewControllers.append(whiteVC);
      self.navigationController.setViewCOntrollers(viewCOntrollers.animated:YES);

您还可以使用上述代码更改弹出 viewCONtrollers 的顺序。

如果黑色 VC 同时呈现橙色并立即呈现白色,那么您将拥有您正在寻找的结构。您可以关闭动画,这样橙色可能就看不到了。

这可以通过让第一个黑色视图控制器呈现第二个橙色视图控制器然后橙色视图控制器呈现第三个白色视图控制器来实现。

但这会带来一个问题:最终用户会清楚地注意到有两个视图控制器被顺序呈现。为了解决这个问题,您需要做一个非常简单的技巧,即从第一个视图控制器获取 屏幕截图 并将其传递给第二个视图控制器以在呈现第三个视图时显示它控制器。

您可以检查 this repository 以了解具体是如何完成的 (Swift 3)。

最终输出将是:

这是一个方法...

  1. 黑赠橙
  2. viewDidLoad中,Orange将White实例化为childVC并将White的视图添加为'full-screen'子视图。
  3. 在 White 中点击按钮时,White 的视图被动画化并从层次结构中删除。
  4. 在 Orange 中点击按钮时,Orange 消失,用户返回到 Black。

这是方法二...

  1. 在 NavigationController 中嵌入 Black 没有 导航栏
  2. 在黑色中点击,实例化橙色和白色 VC
  3. 在导航控制器上调用.setViewControllers:animated:到"stack the views",直接跳转到最后一个视图。
  4. 之后,向后导航使用标准 .popViewController 功能。

您可以在此处查看这两种方法的工作示例:https://github.com/DonMag/SkipNavigation

我能想到的最简单的解决方案是隐藏 OrangeViewController,然后在显示 WhiteViewController 时使用 present(_:animated:completion:) 的完成回调在按钮操作上使用此代码显示它。

@IBAction func goToWhite(_ sender: UIButton) {
    let orangeViewController = storyboard?.instantiateViewController(withIdentifier: "OrangeViewController")
    orangeViewController?.view.isHidden = true
    present(orangeViewController!, animated: false)

    let whiteViewController = storyboard?.instantiateViewController(withIdentifier: "WhiteViewController")
    orangeViewController?.present(whiteViewController!, animated: true) {
        orangeViewController?.view.isHidden = false
    }
}