如何在导航控制器堆栈中将场景切换到几层?
Posted
技术标签:
【中文标题】如何在导航控制器堆栈中将场景切换到几层?【英文标题】:How do I segue to a scene a few layers into a navigation controller stack? 【发布时间】:2016-01-07 19:30:51 【问题描述】:我必须在我的应用程序中添加一个导航控制器,以便我可以使用左侧抽屉菜单(使用 SWRevealViewController),但这会打乱我的顺序。我最初的设计有一个登录屏幕,它根据状态指示器切换到 4 个不同场景之一。
现在我必须添加一个导航控制器,看起来我必须让用户按顺序浏览堆栈中的每个屏幕,直到他们到达相关的屏幕。有没有办法可以跳过第一个或第 2 个屏幕?或者一种在我浏览时不显示它们的方法。
我尝试将 performSegue 放在 viewWillLoad 委托方法中,但屏幕仍然会在继续下一个场景之前加载。
【问题讨论】:
所以你想在你的导航堆栈中展示一个不是第一个视图控制器? 是的,我猜。如果我有视图控制器 A B C D,而不是去 A -> B -> C -> D 我想直接去 A -> D 查看故事板 ID 以展示/推送视图控制器 【参考方案1】:将 Storyboard ID 添加到最终将被推送的所有视图/导航控制器:
现在要推送所需的视图,这取决于您的 当前 视图控制器是否位于:在导航控制器的堆栈内部还是外部:
如果您的 VC 已经在 Navigation Controller 堆栈中
从您当前的ViewController
推送所需的视图:
if let myViewController = self.storyboard?.instantiateViewControllerWithIdentifier("myViewController") as? MyViewControllerClassName
self.navigationController?.pushViewController(myViewController, animated: true)
注意:as? MyViewControllerClassName
仅在您的 View Controller 的类不是默认的 UIViewController
而是扩展它的自定义类时才需要。
如果您的 VC 不在导航控制器堆栈中
同样的原则适用,只是这一次你需要在推送所需的视图控制器之前推送导航控制器本身:
if let newNavController = self.storyboard?.instantiateViewControllerWithIdentifier("myNavigationController") as? UINavigationController
self.view.window?.rootViewController = newNavController
// Now push the desired VC as the example above, only this time your reference to your nav controller is different
if let myViewController = self.storyboard?.instantiateViewControllerWithIdentifier("myViewController") as? MyViewControllerClassName
newNavController.pushViewController(myViewController, animated: true)
【讨论】:
所以如果有视图控制器 A | B C D 导航控制器从 B 开始我可以使用您描述的方法吗?还是我需要已经在导航堆栈中? @Chris 该代码从 B 开始工作。即从 B 你想显示 D。如果你在 A,它在导航控制器堆栈中 not,它有点不同。我将更新显示这两种情况的答案,等等。 @Chris 更新了答案,请看一下。我相信这就是您所需要的。 太棒了,非常感谢!虽然我意识到我还有一个问题......因为我想将 SWRevealViewController 用于我的左侧抽屉菜单,该菜单实际上位于 VC A 和 B 之间。所以我真正拥有的是:A (SWReveal) (NavController) B C D. Don '假设你不知道如何处理这种情况? @Chris 不幸的是,我以前没有使用过 SWReveal,但看起来像 this 和 this 答案可能会帮助你:)以上是关于如何在导航控制器堆栈中将场景切换到几层?的主要内容,如果未能解决你的问题,请参考以下文章