Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何将场景从几层分割到导航控制器堆栈中?_Ios_Swift - Fatal编程技术网

Ios 如何将场景从几层分割到导航控制器堆栈中?

Ios 如何将场景从几层分割到导航控制器堆栈中?,ios,swift,Ios,Swift,我不得不在我的应用程序中添加一个导航控制器,这样我就可以使用左边的抽屉菜单(使用SWRevealViewController),但这会弄乱我的程序。我最初的设计有一个登录屏幕,根据一个状态指示器,可以切换到4个不同场景中的一个 现在,我必须添加一个导航控制器,看起来我必须让用户按顺序通过堆栈中的每个屏幕,直到他们到达相关屏幕为止。有没有办法跳过第一屏或第二屏?或者在我浏览时不显示它们的方式 我尝试在viewWillLoad委托方法中放置performSegue,但在切换到下一个场景之前,屏幕仍会

我不得不在我的应用程序中添加一个导航控制器,这样我就可以使用左边的抽屉菜单(使用SWRevealViewController),但这会弄乱我的程序。我最初的设计有一个登录屏幕,根据一个状态指示器,可以切换到4个不同场景中的一个

现在,我必须添加一个导航控制器,看起来我必须让用户按顺序通过堆栈中的每个屏幕,直到他们到达相关屏幕为止。有没有办法跳过第一屏或第二屏?或者在我浏览时不显示它们的方式


我尝试在viewWillLoad委托方法中放置performSegue,但在切换到下一个场景之前,屏幕仍会加载。

将情节提要ID添加到最终将被推送的所有视图/导航控制器:

现在要推送所需视图,取决于当前视图控制器是否位于导航控制器堆栈内或堆栈外:

如果您的VC已经在导航控制器堆栈中 从当前的
ViewController
推送所需视图:

if let myViewController = self.storyboard?.instantiateViewControllerWithIdentifier("myViewController") as? MyViewControllerClassName {
     self.navigationController?.pushViewController(myViewController, animated: true)
}
注:
as?仅当视图控制器的类不是默认的
UIViewController
,而是扩展它的自定义类时,才需要MyViewControllerClassName

如果您的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)
    }

}

将情节提要ID添加到最终将被推送的所有视图/导航控制器:

现在要推送所需视图,取决于当前视图控制器是否位于导航控制器堆栈内或堆栈外:

如果您的VC已经在导航控制器堆栈中 从当前的
ViewController
推送所需视图:

if let myViewController = self.storyboard?.instantiateViewControllerWithIdentifier("myViewController") as? MyViewControllerClassName {
     self.navigationController?.pushViewController(myViewController, animated: true)
}
注:
as?仅当视图控制器的类不是默认的
UIViewController
,而是扩展它的自定义类时,才需要MyViewControllerClassName

如果您的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,而不是A->B->C->D,我想直接A->D进入storybaord ID以显示/推送视图控制器,所以你想在导航堆栈中显示非第一个视图控制器?是的,我想。如果我有视图控制器A B C D,而不是去A->B->C->D,我想直接去A->D查看storybaord ID以显示/推送视图控制器,那么如果有视图控制器A | B C D,导航控制器从B开始,我可以使用您描述的方法吗?或者我需要已经在导航堆栈中吗?@Chris该代码从B开始工作。i、 e.从B开始,您希望显示D。如果您位于A,它不在导航控制器堆栈中,则有点不同。我将更新显示这两种情况的答案,请稍候。@Chris更新了答案,请看一看。我相信这就是你所需要的。太棒了,太好了,谢谢你了!虽然我意识到我还有一个问题。。。因为我想在我的左抽屉菜单中使用SWRevealViewController,它实际上在VCs A和B之间。所以我真正拥有的是:A(SWREVEL)(NavController)B C D。难道你不知道如何处理这种情况吗?@Chris不幸的是,不,我以前没有与SWREVEL合作过,但是看起来和答案可能会帮助你:)所以如果有视图控制器A | B C D,导航控制器从B开始,我可以使用你描述的方法吗?或者我需要已经在导航堆栈中吗?@Chris该代码从B开始工作。i、 e.从B开始,您希望显示D。如果您位于A,它不在导航控制器堆栈中,则有点不同。我将更新显示这两种情况的答案,请稍候。@Chris更新了答案,请看一看。我相信这就是你所需要的。太棒了,太好了,谢谢你了!虽然我意识到我还有一个问题。。。因为我想在我的左抽屉菜单中使用SWRevealViewController,它实际上在VCs A和B之间。所以我真正拥有的是:A(SWREVEL)(NavController)B C D。难道你不知道如何处理这种情况吗?@Chris不幸的是,不,我以前没有使用过SWREVEL,但看起来和答案可能会帮助你:)