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

时间:2017-05-02 15:00:34

标签: ios swift uiviewcontroller presentviewcontroller

我的目标是提供一个视图控制器而不直接忽略它的presentingViewController

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

参考这个故事板:

enter image description here

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

  • 黑色 VC 呈现 白色 VC。
  • 白色 VC 解散 Orange VC。
  • 橙色 VC 解散黑色 VC。

如何应用这种行为?

备注:没有导航控制器,它应该存在/关闭,而不是推/弹。

5 个答案:

答案 0 :(得分:2)

这是一个方法......

  1. 黑色呈现橙色
  2. viewDidLoad中,Orange将White实例化为childVC,并将White的视图添加为“全屏”子视图。
  3. 点击白色按钮,白色视图将被动画化并从层次结构中移除。
  4. 点击橙色按钮,橙色被解除,使用户返回黑色。
  5. enter image description here

    这是方法二......

    1. 将Black嵌入导航控制器,不带导航栏
    2. 点击黑色,实例化橙色和白色VC
    3. 在导航控制器上调用.setViewControllers:animated:“堆叠视图”,然后直接跳转到最后一个视图。
    4. 之后,向后导航使用标准.popViewController功能。
    5. enter image description here

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

答案 1 :(得分:1)

如果黑色VC既呈现橙色又呈现白色,您将拥有您正在寻找的结构。您可以关闭动画,以便橙色可能不可见。

答案 2 :(得分:1)

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

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

您可以查看this repository,看看它是如何完成的(Swift 3)。

最终输出将是:

enter image description here

答案 3 :(得分:0)

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

@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
    }
}

答案 4 :(得分:-2)

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

以任何顺序设置所有视图控制器
   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);

您还可以使用上面的代码更改弹出viewCO控制器的顺序。