如何以编程方式添加多个导航控制器?

Posted

技术标签:

【中文标题】如何以编程方式添加多个导航控制器?【英文标题】:How to add multiple navigation controllers programatically? 【发布时间】:2016-08-21 09:16:33 【问题描述】:

我的应用从视图 A 开始,所有视图都有一个带有 4 个按钮的标签栏 那让你跳到A、B、C、D

我目前拥有的是这种情况:

如果您导航到 A、B、C、D 中的任何一个,您将返回堆栈底部 上面所有的都被消灭了。

但我需要它像这张图片一样,例如这些导航发生了

1: A>1
2: B>3>7
3: C>2>5>6>8>7
4: D>9>1

现在当我从 1 移动到 B 时,我回到 7,即 B 的顶部

问题:我认为我需要多个导航控制器,对吧?我也把它放在appDelegatedidFinishLaunchingWithOptions 函数中,如何以编程方式执行多个导航控制器?以及在 A、B 推送或加载视图控制器之间使用什么?

    ////////// NC

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    let mainView        = storyboard.instantiateViewControllerWithIdentifier("selectLocation") as! selectLocation // 1 Home
    let searchView      = storyboard.instantiateViewControllerWithIdentifier("2") as! Search // 1 Home
    let friendsView     = storyboard.instantiateViewControllerWithIdentifier("3") as! Friends // 1 Home
    let meView          = storyboard.instantiateViewControllerWithIdentifier("4") as! Me // 1 Home

    var nav1 = UINavigationController()
    nav1.viewControllers = [mainView]
    nav1.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]

    var nav2 = UINavigationController()
    nav2.viewControllers = [searchView]
    nav2.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]

    var nav3 = UINavigationController()
    nav3.viewControllers = [friendsView]
    nav3.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]

    var nav4 = UINavigationController()
    nav4.viewControllers = [meView]
    nav4.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]

    UINavigationBar.appearance().barTintColor = UIColor(red: 176.0/255.0, green: 190.0/255.0, blue: 105.0/255.0, alpha: 1.0)
    UINavigationBar.appearance().tintColor = UIColor.whiteColor()
    UINavigationBar.appearance().barStyle = UIBarStyle.BlackTranslucent

    self.window!.rootViewController = nav1
    self.window?.makeKeyAndVisible()

    ////////// NC

【问题讨论】:

notice : - 我已经解决了这个问题,如果您需要解决方案,我将准备一个示例 github 项目并在此处链接。 你有没有机会获得该 GitHub 示例? 【参考方案1】:

您的 AppDelegate 中应该有一个通用的 UINavigationController,其中包括通用应用 NavigationController,在该选项卡导航控制器内,您可以添加所有带有 UIViewController 的导航控制器作为 rootviewcontroller。

这将为每个选项卡使用导航控制器,该控制器将处理该路径内的导航。如果用户在选项卡之间导航,则这些选项卡将在该选项卡中具有最新的视图控制器。 要以编程方式执行此操作,我将创建导航控制器对象并将 rootviewcontroller 设置为堆栈中的第一个。

您可以通过这种方式为每个选项卡启动导航。

private lazy var navigationController:UINavigationController? = 
    let navigationController = UINavigationController(rootViewController: InitialViewController())
    navigationController.setNavigationBarHidden(true, animated: false)
    return navigationController
()

然后每个用户点击您需要推送另一个 UIViewController

self.navigationController?.pushViewController(vc, animated: animated)

这样你就可以回到堆栈中。

如果需要,您可以通过这种方式更改 rootViewController

self.navigationController?.setViewControllers([vc], animated: animated)

我会考虑创建一个包装类的好习惯,其中包括应用程序 navigationController 和 NavigationControllers 数组以及在需要时推送/设置导航的方法。看看这个类似question

希望对你有所帮助。

【讨论】:

好,但我把“私人懒惰....”sn-p 放在委托中?为什么不创建4?我可以看到你只创建了一个,你能提供一个详细的例子吗?这个问题仍然让我感到困惑...... [添加 4 个导航控制器] 到问题的代码中。 对不起,我正在努力完成这项工作,阅读了 ios 书籍中的部分,仍然感到困惑,我搜索了很多,做了很多实验,并应用了上面的内容并看到了你的链接发布和其他链接,github上没有关于此的任何示例吗?请尝试帮助我,我被卡住了,懒惰的变量放在哪里?我试图将该 var 放在每个选项卡视图中确实加载。 当我添加惰性变量i.imgur.com/xkC9tpa.png时会出现这种情况@ 我不能只写整个例子。 navigationController 的惰性 var 只是一个想法。我不知道你的代码结构。从图形上看,这个想法是***.com/a/25790498/2000162,而将视图控制器添加到导航控制器的方式是***.com/a/27592135/2000162 我已经解决了这个问题,如果有人需要解决方案,我会准备一个示例 github 项目并在此处链接。

以上是关于如何以编程方式添加多个导航控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何向在 tabcontroller 中以编程方式创建的导航控制器中的 barbuttonitem 添加操作

以编程方式向导航控制器添加自动布局约束

以编程方式将按钮添加到 UINavigationController

以编程方式为第二个 VC 添加导航控制器

如何以编程方式显示/推送导航控制器

以编程方式将表添加到导航控制器视图不起作用