如何在导航控制器堆栈中将场景切换到几层?

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 答案可能会帮助你:)

以上是关于如何在导航控制器堆栈中将场景切换到几层?的主要内容,如果未能解决你的问题,请参考以下文章

Vue实现左右滑动内容区控制导航tab同时切换高亮

如何在不使用导航栏的情况下从导航堆栈中弹出控制器

如何在导航控制器中关闭视图控制器,而不关闭整个堆栈

如何检查视图控制器是不是以模态方式呈现或推送到导航堆栈上?

如何从堆栈中弹出视图控制器而不导航到它们

如何创建以 TabBarViewController 为根的导航堆栈?