我正在尝试编写一个刽子手游戏,并且在解开细分时遇到了麻烦。我有多个视图控制器,最终导致相同的视图,用户在其中播放实际的刽子手。 但是,根据呈现控制器,我希望游戏处于不同的模式" (即:多人游戏,单人游戏等)。我正在尝试添加一个可以解除前一个视图控制器的播放按钮,但是当用户可以使用多个路径进入此视图时,我不确定如何放松。
换句话说,我的应用程序有点:
A - > B - > C或
A - > D - > C其中C可以(理想地)展开到D或B.
我想知道实现这个的最佳方法是什么?我应该只将所有视图控制器嵌入导航控制器吗?或者有没有办法根据某种条件呈现某个视图控制器?谢谢你的帮助!
答案 0 :(得分:17)
如果您有任何自定义逻辑并希望以编程方式将unwind segue调用到不同的视图控制器,请按以下步骤操作:
将unwindFromCViewController
添加到BViewController
和DBViewController
:
<强> BViewController.swift 强>
class BViewController : UIViewController {
@IBAction func unwindFromCViewController(segue:UIStoryboardSegue) {
}
}
<强> DViewController.swift 强>
class DViewController : UIViewController {
@IBAction func unwindFromCViewController(segue:UIStoryboardSegue) {
}
}
在您的故事板中,创建此segue并为其指定一个标识符,并将其链接到您在上面定义的操作unwindFromCViewController
:
从代码中调用展开segue:
self.performSegueWithIdentifier("unwindFromCViewControllerSugueId", sender: self)
通过它,您可以放松到以前的视图,无论它来自哪里。
答案 1 :(得分:10)
展开segue进程通常会自动确定先前的UIViewController实例。 Apple的此Tech Note中描述了确切的过程,但总结如下:
从启动展开的视图控制器开始 搜索顺序如下:
响应者链中的下一个视图控制器被发送a
viewControllerForUnwindSegueAction:fromViewController:withSender:
信息。对于以模态方式呈现的视图控制器,这将是 查看调用的控制器presentViewController:animated:completion:
。否则, parentViewController。默认实现搜索 接收者的
childViewControllers
数组用于想要的视图控制器 处理展开动作。如果没有接收者的孩子观看 控制器想要处理展开动作,接收器检查 它是否想要处理展开动作并返回自我 确实。在这两种情况下,canPerformUnwindSegueAction:fromViewController:withSender:
方法是 用于确定给定的视图控制器是否想要处理 展开行动。- 醇>
如果没有返回视图控制器
viewControllerForUnwindSegueAction:fromViewController:withSender:
in 第一步,搜索从下一个视图控制器重复 响应链。
因此,精确的过程将取决于您如何呈现视图控制器C - 例如,通过UINavigationController
上的模态演示segue或push segue,但只要B和D都实现展开动作你应该是好的。
答案 2 :(得分:3)
如果您将其推送到导航堆栈,我只需调用代码popViewController:animated
即可转到呈现控制器,如果是以模态方式呈现,则调用dismissViewController:animated
。