以编程方式导航到另一个故事板上的导航控制器和标签栏控制器内的视图控制器

Posted

技术标签:

【中文标题】以编程方式导航到另一个故事板上的导航控制器和标签栏控制器内的视图控制器【英文标题】:Navigate programmatically to viewcontroller inside navigationcontroller & tabbarcontroller on another storyboard 【发布时间】:2017-04-05 15:14:56 【问题描述】:

我需要以编程方式从另一个 Storyboard 转到视图控制器。从这里轻松。但问题是:viewController 嵌入在导航控制器中,而这个嵌入在 tabBarController 中(见图)

我试过了:

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

    let viewcontroller = storyboard.instantiateViewController(withIdentifier: "controller_id")
    let navigationController = UINavigationController(rootViewController: viewcontroller)

    self.present(navigationController, animated: true, completion: nil)

我得到的是:我转到正确的控制器,导航控制器工作,但没有 tabbarcontroller

再试一次:

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

    let tabbar = storyboard.instantiateViewController(withIdentifier: "tab_id")
    let navigationController = UINavigationController(rootViewController: tabbar)

    self.present(navigationController, animated: true, completion: nil)

在这种情况下,标签栏正在工作,但没有导航控制器。

然后……试试 3 号:

    let storyboard = UIStoryboard(name: "Inside", bundle: nil)
    let tabbar = storyboard.instantiateViewController(withIdentifier: "tab_id")
    let viewcontroller = storyboard.instantiateViewController(withIdentifier: "race_id")

    let navigationController = UINavigationController(rootViewController: tabbar)

    navigationController.pushViewController(viewcontroller, animated: false)

    self.present(navigationController, animated: true, completion: nil)

在这种情况下,行为是如此奇怪......我出现在正确的控制器中,但带有一个后退按钮。如果我单击我会转到同一个正确的控制器...使用 tabbarcontroller...然后导航控制器消失...很好:S

任何方式以编程方式转到正确的控制器并开始工作标签栏和导航?

【问题讨论】:

你有没有试过在标签栏控制器的故事板属性中检查“是初始视图控制器”,然后简单地做UIStoryboard(..).instantiateInitialViewController() 在您以编程方式创建导航控制器的所有示例中,尝试从Inside storyboard by id 获取导航控制器 你从哪里开始?您是否在选项卡“A”中,并且想要将 I need to go here 加载为 NavigationControllerRootViewController 作为选项卡“B”? @wbarksdale 引导我找到正确的答案。关键是检查“是初始视图控制器”并显示标签栏控制器。 【参考方案1】:

试试下面的代码:

var storyBoard = UIStoryboard(name: "SecondStoryboard", bundle: nil)
var tabbar: UITabBarController? = (storyBoard.instantiateViewController(withIdentifier: "tabbar") as? UITabBarController)
navigationController?.pushViewController(tabbar, animated: true)

我对 swift 的了解较少。上面的 Objective-C 代码是:

    UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"SecondStoryboard" bundle:nil];
    UITabBarController *tabbar = (UITabBarController *)[storyBoard instantiateViewControllerWithIdentifier:@"tabbar"];
    [self.navigationController pushViewController:tabbar animated:YES];

【讨论】:

这很有帮助,只有两件事:1) 有一些语法修复要做,如果你对 Objective-c 很熟悉,并且 2)(非常重要),我将我的标签栏控制器标记为'IsInitial...' 正如@wbarksdale 评论的那样。 @XavierGarciaRubio 感谢您的信息。如果我的回答有帮助请采纳。再次感谢。

以上是关于以编程方式导航到另一个故事板上的导航控制器和标签栏控制器内的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

故事板上的侧边栏导航菜单

以编程方式打开视图控制器并且看不到导航栏。斯威夫特 3

导航栏从我的故事板项目中消失了

故事板下添加的导航项

标签栏上方出现黑条

在标签栏控制器中访问多个导航控制器