【问题标题】:Stop Navigation Controller from affecting other View Controllers阻止导航控制器影响其他视图控制器
【发布时间】:2015-09-27 09:37:17
【问题描述】:

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

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

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

用户在设置后应该无法访问初始设置。我的故事板如下所示:

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

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

【问题讨论】:

  • 这是个好问题。我建议为此使用两个不同的故事板,一个用于执行初始设置,另一个用于您的主 UI。

标签: ios xcode swift uinavigationcontroller uinavigationbar


【解决方案1】:

一个非常简单的解决方案是解决这个问题,就是从你想要嵌入到 UINavigationController 中的最后一个 UIVieController 到你想要脱离 UINavigationController 的那个。

第 1 步。 Ctrl 从 UIViewController 顶部的黄色图标(嵌入在 UINavigationController 中)拖动到要继续的 UIViewController(在 UINavigationController 之外),然后选择“Present Modally”

第 2 步。 在故事板中给 segue 一个标识符

第 3 步。 在你的代码中,你想在哪里做segue,放;

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    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;
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多