如何同时呈现两个视图控制器?(涉及 IT 技术)

7
我的目标是呈现一个视图控制器,而不是直接取消其presentingViewController
为了更清楚,考虑以下示例:
参考此故事板:

enter image description here

假设第一个黑色视图控制器是第一个(初始)视图控制器,它应该呈现第三个白色视图控制器;问题在于白色视图控制器应该解除到第二个橙色视图控制器而不是黑色视图控制器,因此它应该表现为:
- 黑色VC呈现白色VC。 - 白色VC解除到橙色VC。 - 橙色VC解除到黑色VC。
如何应用这样的行为?
备注:没有导航控制器,应该是呈现/解除,而不是推送/弹出。

你想使用标准的“弹出时向上滑动,关闭时向下滑动”的动画效果吗? - DonMag
@DonMag 不管是什么动画,使用默认的动画就可以了。 - Ahmad F
几个选项... 1)嵌入到UINavigationController,但不显示导航栏 -- 只使用推送/弹出堆栈管理。2)黑色呈现橙色...在加载时,橙色将白色作为子VC/子视图添加...在点击按钮时,橙色使白色动画消失...在另一个按钮点击时,橙色被解除显示。 - DonMag
@DonMag 谢谢您的评论。我想邀请您查看我的答案并提出您的意见。 - Ahmad F
5个回答

6

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

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

您可以查看这个存储库,了解如何准确地完成此操作(Swift 3)。

最终输出将是:

enter image description here


1
嗯...你其实不需要绕过“截图”的步骤。看看我的答案,有另一种方法可以做到。 - DonMag

3

以下是第一种方法...

  1. Black呈现Orange
  2. viewDidLoad中,Orange将White作为子视图控制器进行实例化,并将White的视图添加为“全屏”子视图。
  3. 在White中的按钮点击后,White的视图会被动画移除并从层次结构中删除。
  4. 在Orange中的按钮点击后,Orange会被解散,用户返回到Black。

enter image description here

以下是第二种方法...

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

enter image description here

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


你认为这是更好的方法吗?在我看来,我觉得实现这样的事情有点复杂。顺便说一下,谢谢你的帮助 :) - Ahmad F
我添加了第二种方法 - 使用导航控制器 导航栏。允许更标准的推入/弹出类型导航。 - DonMag
哪种方法更好?很难说… 我认为在控制器之间进行屏幕截图和传递可能会变得混乱,这取决于其他需要完成的任务。此外,在高分辨率设备上可能效率不高? - DonMag

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

这不会产生期望的结果,就像我在我的回答中提到的那样,最终用户明显会注意到有两个视图控制器被顺序呈现。我邀请你检查我的答案 :) - Ahmad F
我在展示橙色视图控制器之前将其隐藏,以便用户在白色视图控制器动画期间不会看到其内容,并且使用“animated: false”进行展示可以消除动画延迟,因此它看起来就像应用程序只显示白色视图控制器。 - avilin

1
如果黑色VC同时呈现橙色和白色,那么您将得到所需的结构。您可以关闭动画,以便橙色可能不可见。

谢谢您的回答。我想邀请您查看我的答案,并提供您的意见,它几乎就是您所提到的... - Ahmad F
它从黑色到橙色再到白色的动画效果使其非常引人注目。如果去掉这个动画,它就是瞬间完成的。 - Owen Hartnett

-4

您可以将导航控制器附加到第一个控制器上。然后,在单击第一个视图控制器时,您可以使用以下代码按任何顺序设置所有视图控制器:

   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);

你也可以使用上面的代码更改弹出视图控制器的顺序。


1
没有导航控制器,不是推入/弹出。 - Ahmad F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接