如何将其他视图控制器推送到 NavigationController 但保留 TabBar?

Posted

技术标签:

【中文标题】如何将其他视图控制器推送到 NavigationController 但保留 TabBar?【英文标题】:How to push additional view controllers onto NavigationController but keep the TabBar? 【发布时间】:2012-03-30 02:14:50 【问题描述】:

我有一个以导航控制器根目录下的基本视图控制器开头的应用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.navController.viewControllers = [NSArray arrayWithObject:[self getHomeViewController]];

    [[self getWindow] addSubview:self.navController.view];
    [[self getWindow] makeKeyAndVisible];

    return YES;

一旦选择了一个导航项,我就会推送一个带有几个视图控制器的标签栏控制器。

-(void)launchOptionWithTabBarController:(NSUInteger)selectedIndex

    self.tabBarController.viewControllers = [NSArray arrayWithObjects:
                                             [self getFirstViewController], 
                                             [self getSecondViewController],
                                             nil];

    [self.tabBarController setSelectedIndex:selectedIndex];
    [self.navController pushViewController:self.tabBarController animated:YES];

问题是我现在需要在标签栏控制器中打开的视图控制器之上添加另一个视图控制器......当我像这样将一个视图控制器推送到导航控制器时......

- (void)launchNewViewControllerWithArray:(NSArray *)stuff

    self.newViewController = [self getNewViewController];

    [self.navController pushViewController:self.newViewController animated:YES];

我不再看到标签栏导航(我更希望看到这个导航和我推送的每个项目)。

如何修改我的控制流以使标签栏导航项保持在底部?

【问题讨论】:

【参考方案1】:

您需要在标签栏控制器中设置导航控制器的父级,反之亦然。或者在你的标签栏控制器上引入另一个导航控制器,然后将新的视图控制器推送到它上面。

【讨论】:

【参考方案2】:

您可以通过在标签栏选定的视图控制器上推送新的视图控制器来实现这一点。所以你可以像这样编写你的启动函数

- (void)launchNewViewControllerWithArray:(NSArray *)stuff

    self.newViewController = [self getNewViewController];

    [[self.tabbarController selectedViewController] pushViewController:self.newViewController animated:YES];

【讨论】:

以上是关于如何将其他视图控制器推送到 NavigationController 但保留 TabBar?的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个视图控制器推送到导航控制器上

如何将新的 viewController 推送到另一个视图控制器中的现有视图中?

如何快速将需求视图控制器推送到导航控制器

如何在将数据推送到导航堆栈之前将数据传递给视图控制器并加载它?

iOS - 如何推送到视图控制器并在返回时保持正确的“视图堆栈”

如何将segue从表格视图中的单元格单击推送到另一个视图控制器[重复]