Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.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_Xcode_Swift_Uinavigationcontroller_Uinavigationbar - Fatal编程技术网

Ios 阻止导航控制器影响其他视图控制器

Ios 阻止导航控制器影响其他视图控制器,ios,xcode,swift,uinavigationcontroller,uinavigationbar,Ios,Xcode,Swift,Uinavigationcontroller,Uinavigationbar,我有一个应用程序,它使用一个带有三个视图控制器的导航控制器进行逐步的用户设置。因此,第一个视图是步骤1,第二个步骤2,等等,所有这些都将嵌入导航控制器中,以便用户能够来回。但是,一旦此设置完成并且用户按下“完成”按钮,应用程序将以编程方式移动到故事板的另一部分,该部分应与初始设置分开。我使用以下代码以编程方式转到本节: let vc : AnyObject! = self.storyboard!.instantiateViewControllerWithIdentifier("welc

我有一个应用程序,它使用一个带有三个视图控制器的导航控制器进行逐步的用户设置。因此,第一个视图是步骤1,第二个步骤2,等等,所有这些都将嵌入导航控制器中,以便用户能够来回。但是,一旦此设置完成并且用户按下“完成”按钮,应用程序将以编程方式移动到故事板的另一部分,该部分应与初始设置分开。我使用以下代码以编程方式转到本节:

let vc : AnyObject! = self.storyboard!.instantiateViewControllerWithIdentifier("welcomeViewController")
self.showViewController(vc as! UIViewController, sender: vc)
UIStoryboard *main = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *welcomeViewController = [main instantiateViewControllerWithIdentifier:@"WelcomeViewController"];
UIWindow *mainApplicationWindow = [[[UIApplication sharedApplication] delegate] window];
mainApplicationWindow.rootViewController = welcomeViewController;
其中,“welcomeViewController”是设置后ViewController的标识符。但是,一旦发生这种情况,导航控制器栏仍然会出现在顶部,您仍然可以导航回设置菜单,这根本不是我想要的。我的意思是:

在已经设置之后,用户不应该能够访问初始设置。我的故事板如下所示:

左四个框用于设置。右三个框是我要创建的“主菜单”


正如您所看到的,在最后一个设置控制器和选项卡栏控制器之间没有箭头,因为我是通过编程方式执行的(如上所示)。如何使导航控制器停止影响视图控制器的其余部分?

这是因为引擎盖下的segue使用了当前的
UINavigationController
,因此无论是以编程方式还是直接在情节提要中执行segue都无关紧要

有很多方法可以解决这个问题。一个非常简单的方法是使用
self.navigationItem.hidesBackButton=YES在
WelcomeViewController
中隐藏后退按钮

但是,如果您确实希望在这些视图控制器之间进行分离,并且希望摆脱负责设置过程的
UINavigationController
,那么这并不能真正解决您的问题。对于这种情况,我建议使用两种不同的故事板,一种用于初始设置,另一种用于主要部分。然后以编程方式将
ui窗口的
rootViewController
从另一个情节提要切换到视图控制器。这只需几行代码就可以完成,并有助于分离您的关注点,更好地查看应用程序的流程

如果您需要进一步解释,请在评论中告诉我:)

可以使用以下代码切换故事板:

let vc : AnyObject! = self.storyboard!.instantiateViewControllerWithIdentifier("welcomeViewController")
self.showViewController(vc as! UIViewController, sender: vc)
UIStoryboard *main = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *welcomeViewController = [main instantiateViewControllerWithIdentifier:@"WelcomeViewController"];
UIWindow *mainApplicationWindow = [[[UIApplication sharedApplication] delegate] window];
mainApplicationWindow.rootViewController = welcomeViewController;
但是,如果您想实例化在r主界面中使用的整个
UITabBarController
,则必须在情节提要中为其提供一个ID(例如
MainTabBarController
),以便您可以使用
InstanceViewController标识符:
对其进行实例化。因此,与其实例化您的
WelcomeViewController
,不如:

UIStoryboard *main = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UITabBarController *mainTabBarController = [main instantiateViewControllerWithIdentifier:@"MainTabBarController"];
UIWindow *mainApplicationWindow = [[[UIApplication sharedApplication] delegate] window];
mainApplicationWindow.rootViewController = mainTabBarController;

对于这个问题,一个非常简单的解决方案是,将要嵌入UINavigationController的上一个UIVieController与要嵌入UINavigationController的UIVieController分开

第一步。 Ctrl键从UIViewController(嵌入在UINavigationController中)顶部的黄色图标拖动到要切换到的UIViewController(从UINavigationController中),然后选择“以模式显示”

第二步。 在情节提要中为序列提供一个标识符

第三步。 在你的代码中,在你想继续的地方,放置

performSegue(withIdentifier: "yourSegueID", sender: self)

这将起到作用,并使您的故事板更具可读性。

这是一个好问题。我建议为此使用两个不同的故事板,一个用于执行初始设置,另一个用于主UI。如果可能,您能否解释或链接到一个页面,解释如何切换故事板?查看此答案以了解详细说明:)