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

Stop Navigation Controller from affecting other View Controllers

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

let vc : AnyObject! = self.storyboard!.instantiateViewControllerWithIdentifier("welcomeViewController")
self.showViewController(vc as! UIViewController, sender: vc)

其中“welcomeViewController”是 post-setup ViewController 的标识符。然而,一旦发生这种情况,导航控制器栏仍然出现在顶部,您仍然可以导航回设置菜单,这根本不是我想要的。这就是我的意思:

用户在完成设置后应该无法访问初始设置。我的情节提要如下所示:

左边四个方框用于设置。右边三个框就是我要创建的'Main Menu'

如您所见,最后一个设置控制器和选项卡栏控制器之间没有箭头,因为我以编程方式执行了该 segue(如上所示)。如何让导航控制器停止影响我的其余视图控制器?

发生这种情况是因为引擎盖下的 segue 使用了当前的 UINavigationController,因此无论您是通过编程方式还是直接在故事板中执行 segue 都没有关系。

有很多方法可以解决这个问题。实现它的一个非常简单的方法是使用 self.navigationItem.hidesBackButton = YES;.

简单地隐藏 WelcomeViewController 中的后退按钮

但是,如果您真的想要在这些视图控制器之间进行分离并且想要摆脱负责您的设置过程的 UINavigationController,这并不能真正解决您的问题。对于这种情况,我实际上建议使用 两个不同的故事板 ,一个用于初始设置,一个用于主要部分。然后以编程方式将 UIWindowrootViewController 切换到另一个故事板的视图控制器。这可以用几行代码完成,有助于分离您的关注点并更好地直观地了解您的应用程序流程。

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

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

UIStoryboard *main = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *welcomeViewController = [main instantiateViewControllerWithIdentifier:@"WelcomeViewController"];
UIWindow *mainApplicationWindow = [[[UIApplication sharedApplication] delegate] window];
mainApplicationWindow.rootViewController = welcomeViewController;

但是如果你想实例化你在主界面中使用的整个UITabBarController,你必须在情节提要中给它一个ID(例如MainTabBarController),这样你就可以实例化它使用 instantiateViewControllerWithIdentifier:。那么,不是实例化你的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 中),然后 select "Present Modally"

第2步。 在 storyboard

中给 segue 一个标识符

第 3 步。 在你的代码中,你想做 segue 的地方,把;

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

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