13

我正在尝试编写一个刽子手游戏,但在展开 segues 时遇到了麻烦。我有多个视图控制器,它们最终都指向同一个视图,用户在其中扮演真正的刽子手。但是,根据呈现的控制器,我希望游戏处于不同的“模式”(即:多人游戏、单人游戏等)。我正在尝试添加一个再次播放按钮,该按钮可以展开到前一个视图控制器,但我不确定当用户可以采取多条路径到达该视图时如何展开。

换句话说,我的应用程序是这样的:

A -> B -> C 或

A -> D -> C 其中 C 可以(理想情况下)展开到 D 或 B。

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

4

3 回答 3

20

如果您有任何自定义逻辑并希望以编程方式调用 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

        在此处输入图像描述

        在此处输入图像描述

  1. 从代码中调用 unwind segue:

    self.performSegueWithIdentifier("unwindFromCViewControllerSugueId", sender: self)
    

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

于 2016-09-20T19:16:00.480 回答
10

unwind segue 过程一般会自动判断之前的 UIViewController 实例。Apple的此技术说明中描述了确切的过程,但总结如下:

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

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

    默认实现在接收者的childViewControllers数组中搜索想要处理展开动作的视图控制器。如果接收者的子视图控制器都不想处理展开动作,则接收者检查它是否想要处理展开动作,如果是,则返回 self。在这两种情况下,该 canPerformUnwindSegueAction:fromViewController:withSender:方法都用于确定给定的视图控制器是否想要处理展开操作。

  2. 如果在第一步中没有返回视图控制器 viewControllerForUnwindSegueAction:fromViewController:withSender:,则从响应者链中的下一个视图控制器开始重复搜索。

因此,精确的过程将取决于您呈现视图控制器 C 的方式——例如,通过模态呈现 segue 或 a 上的 push segue,UINavigationController但只要 B 和 D 都实现了展开操作,您应该是好的。

于 2015-07-24T22:26:20.613 回答
4

I would simply call in code popViewController:animated to go to the presenting controller if you pushed it on the navigation stack, or dismissViewController:animated if it was presented modally.

于 2015-07-24T21:36:05.490 回答