【问题标题】:How to simultaneously present two view controllers?如何同时呈现两个视图控制器?
【发布时间】:2017-05-02 15:00:34
【问题描述】:

我的目标是呈现一个视图控制器,而不是直接将其解散到其presentingViewController

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

参考这个故事板:

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

  • 黑色 VC 礼物 白色 VC。
  • White VC 解雇Orange VC。
  • Orange VC 解雇Black VC。

如何应用这样的行为?

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

【问题讨论】:

  • 您想要标准的“当前上滑,关闭时滑下”动画吗?
  • @DonMag 不管动画是什么。是的,默认动画会很好
  • 几个选项... 1) 嵌入UINavigationController,但不显示导航栏——只使用推送/弹出堆栈管理。 2)黑色呈现橙色......加载时,橙色添加白色作为childVC /子视图......在按钮点击时,橙色动画白色离开......在另一个按钮点击时,橙色被解雇。
  • @DonMag 感谢您的评论。我想邀请您检查my answer并提供您的意见。

标签: ios swift uiviewcontroller presentviewcontroller


【解决方案1】:

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

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

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

最终的输出是:

【讨论】:

  • 嗯......你真的不需要跳过“截图”圈。请参阅我的答案以了解另一种方法。
【解决方案2】:

这是一个方法...

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

这里是方法二……

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

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

【讨论】:

  • 嗯,你认为这是更好的方法吗?在我看来,我觉得实现这样的事情有点复杂。顺便说一句,提前谢谢你:)
  • 我添加了第二种方法 - 使用导航控制器没有导航栏。允许更标准的推送/弹出类型导航。
  • 哪种方法更好?很难说...我会认为进行屏幕抓取并在控制器之间传递可能会变得混乱,这取决于还需要做什么。另外,在高分辨率设备上可能效率不高?
【解决方案3】:

如果黑色 VC 呈现橙色并立即呈现白色,那么您将拥有您正在寻找的结构。您可以关闭动画,以使橙色可能不可见。

【讨论】:

  • 感谢您的回答。我想请你检查my answer并提供你的意见,这几乎就是你提到的......
  • 这是从黑色到橙色到白色的动画,这使它引人注目。删除它,它是瞬时的。
【解决方案4】:

我能想到的最简单的解决方案是隐藏 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
    }
}

【讨论】:

  • 这不会导致预期的结果,正如我在my answer 中提到的,最终用户会清楚地注意到有两个视图控制器已按顺序呈现。我邀请你检查我的答案:)
  • 我在呈现之前隐藏了 OrangeViewController,因此用户在 WhiteViewController 动画期间看不到它的内容,并以“animated: false”呈现它消除了动画延迟,所以它看起来好像应用只显示 WhiteViewController。
【解决方案5】:

您可以将导航控制器附加到第一个控制器。然后单击第一个视图控制器,您可以使用此代码按照您想要的任何顺序设置所有视图控制器

   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 的顺序。

【讨论】:

  • 没有导航控制器,不是push/pop。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
相关资源
最近更新 更多