(Swift)当多个视图控制器导致相同视图时,展开segue?

问题描述 投票:11回答:3

我正在尝试编写一个刽子手游戏,并且在解开细分时遇到麻烦。我有多个视图控制器,最终导致相同的视图,用户在其中播放实际的刽子手。但是,根据呈现控制器,我希望游戏处于不同的“模式”(即:多人游戏,单人游戏等)。我正在尝试添加一个可以解除前一个视图控制器的播放按钮,但是当用户可以使用多个路径进入此视图时,我不确定如何放松。

换句话说,我的应用程序有点:

A - > B - > C或

A - > D - > C其中C可以(理想地)展开到D或B.

我想知道实现这个的最佳方法是什么?我应该只将所有视图控制器嵌入导航控制器吗?或者有没有办法根据某种条件呈现某个视图控制器?感谢您的任何帮助!

ios swift uiviewcontroller segue unwind-segue
3个回答
10
投票

展开segue进程通常会自动确定先前的UIViewController实例。确切的过程在Apple的Tech Note中描述,但总结如下:

从启动展开segue的视图控制器开始,搜索顺序如下:

  1. 响应者链中的下一个视图控制器被发送一个viewControllerForUnwindSegueAction:fromViewController:withSender:消息。对于以模态方式呈现的视图控制器,这将是调用presentViewController:animated:completion:的视图控制器。否则,parentViewController。 默认实现在接收器的childViewControllers数组中搜索想要处理展开操作的视图控制器。如果接收者的子视图控制器都不想处理展开动作,则接收器检查是否要处理展开动作并返回self(如果是)。在这两种情况下,canPerformUnwindSegueAction:fromViewController:withSender:方法用于确定给定的视图控制器是否想要处理展开动作。
  2. 如果在步骤1中没有从viewControllerForUnwindSegueAction:fromViewController:withSender:返回视图控制器,则从响应器链中的下一个视图控制器重复搜索。

因此,精确的过程将取决于您如何呈现视图控制器C - 例如,通过模态表示segue或UINavigationController上的推送segue,但只要B和D都执行展开操作,您应该是好的。


17
投票

如果您有任何自定义逻辑并希望以编程方式将unwind segue调用到不同的视图控制器,请按以下步骤操作:

  1. unwindFromCViewController添加到BViewControllerDBViewController: BViewController.swift class BViewController : UIViewController { @IBAction func unwindFromCViewController(segue:UIStoryboardSegue) { } } DViewController.swift class DViewController : UIViewController { @IBAction func unwindFromCViewController(segue:UIStoryboardSegue) { } }
  2. 在您的故事板中,创建此segue并为其指定标识符,并将其链接到您在上面定义的操作unwindFromCViewController

enter image description here

enter image description here

  1. 从代码中调用unwind segue: self.performSegueWithIdentifier("unwindFromCViewControllerSugueId", sender: self)

有了它,您可以放松到以前的视图,无论它来自哪里。


3
投票

如果你把它推到导航堆栈上,我会简单地调用代码popViewController:animated去显示控制器,如果是模态显示的话,我会调用dismissViewController:animated

© www.soinside.com 2019 - 2024. All rights reserved.