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

时间:2015-07-24 21:15:20

标签: ios swift uiviewcontroller segue unwind-segue

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

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

A - > B - > C或

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

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

3 个答案:

答案 0 :(得分: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

  3. enter image description here

    enter image description here

    1. 从代码中调用展开segue:

      self.performSegueWithIdentifier("unwindFromCViewControllerSugueId", sender: self)
      
    2. 通过它,您可以放松到以前的视图,无论它来自哪里。

答案 1 :(得分:10)

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

  

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

     
      
  1. 响应者链中的下一个视图控制器被发送a   viewControllerForUnwindSegueAction:fromViewController:withSender:   信息。对于以模态方式呈现的视图控制器,这将是   查看调用的控制器   presentViewController:animated:completion:。否则,   parentViewController。

         

    默认实现搜索   接收者的childViewControllers数组用于想要的视图控制器   处理展开动作。如果没有接收者的孩子观看   控制器想要处理展开动作,接收器检查   它是否想要处理展开动作并返回自我   确实。在这两种情况下,   canPerformUnwindSegueAction:fromViewController:withSender:方法是   用于确定给定的视图控制器是否想要处理   展开行动。

  2.   
  3. 如果没有返回视图控制器   viewControllerForUnwindSegueAction:fromViewController:withSender: in   第一步,搜索从下一个视图控制器重复   响应链。

  4.   

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

答案 2 :(得分:3)

如果您将其推送到导航堆栈,我只需调用代码popViewController:animated即可转到呈现控制器,如果是以模态方式呈现,则调用dismissViewController:animated