在导航到另一个视图控制器之前切换标签栏

Posted

技术标签:

【中文标题】在导航到另一个视图控制器之前切换标签栏【英文标题】:switch tab bar before navigation to another viewcontroller 【发布时间】:2015-08-02 11:17:45 【问题描述】:

我正在制作一个 ios 应用,其中有 标签栏 + 侧边菜单

标签栏有 5 个项目,侧边菜单有大约 12 个菜单。

所有侧边菜单功能都来自 Tab 1,侧边菜单可在标签栏中的所有视图中访问。

这意味着如果我在 Tab 2 上,即使我也可以访问侧边菜单。当我单击 Tab 1 中的侧边菜单项时,我将转到 Tab 1,然后会出现导航。

我想做的是,如果我从侧面菜单中单击“投诉”菜单,我想转到 ComplainsViewController。

我使用的代码如下。

// go to first tab
self.tabBarController.selectedIndex = 0;
// now navigate
ComplainsViewController *sViewCon = [self.storyboard instantiateViewControllerWithIdentifier:@"Complains"];
CATransition *transition = [CATransition animation];
transition.duration = 0.5;
transition.type = kCATransitionFade;
[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];
[self.navigationController pushViewController:sViewCon animated:NO];

我有两种情况。

场景 1(正确)

我在选项卡 1 上,然后单击侧面菜单中的投诉。当我点击时,我使用上面的代码成功进入 ComplainsViewController。

场景 2(不正确)

我在选项卡 2 上,然后单击侧面菜单中的投诉。当我单击时,我成功转到选项卡 1,但我没有导航到 ComplainsViewController。当我单击返回选项卡 2 时,我看到在选项卡 2 中打开了 ComplainsViewController。

知道如何先切换到 Tab,然后导航到另一个视图控制器吗?


编辑 1

下面是我的基本结构。

【问题讨论】:

您是否尝试过在推送之前弹出到根视图控制器? [[self navigationController] popToRootViewControllerAnimated:NO]; 【参考方案1】:

您好像在切换标签后忘记切换navigationController。 尝试实现UITabBarControllerDelegate方法:

- (void)tabBarController:(UITabBarController * _Nonnull)tabBarController
 didSelectViewController:(UIViewController * _Nonnull)viewController 
    self.currentNavigationController = (UINavigationController *)viewController;

然后当你手动切换标签时使用这个代码:

// go to first tab
self.tabBarController.selectedIndex = 0;

// Manually call delegate method
[self tabBarController:self.tabBarController didSelectViewController:self.tabBarController.selectedViewController];

// now navigate
ComplainsViewController *sViewCon = [self.storyboard instantiateViewControllerWithIdentifier:@"Complains"];
CATransition *transition = [CATransition animation];
transition.duration = 0.5;
transition.type = kCATransitionFade;
[self.currentNavigationController.view.layer addAnimation:transition forKey:kCATransition];
[self.currentNavigationController pushViewController:sViewCon animated:NO];

为了这个目标,您需要创建新的属性来保留currentNavigationController

【讨论】:

你能详细说明你的陈述吗 为了这个目标,你需要创建新的属性来保持 currentNavigationController。 我不明白需要做什么...... 我说的是在课堂上创建属性:@property (nonatomic, strong) UINavigationController *currentNavigationController;【参考方案2】:

最后我设法通过使用 NSNotificationCenter

以另一种方式解决了这个问题

下面是我所做的。

第 1 步(在 SideMenuViewController 中)

// let first go to first index
self.tabBarController.selectedIndex = 0; 
// now post notification and make transition
[[NSNotificationCenter defaultCenter] postNotificationName:@"TakeMeToComplains" object:nil];

第 1 步,将更改 selectedIndex 并发布通知。

第 2 步(在所有其他视图控制器中)

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(globalTakeMeToComplains) name:@"TakeMeToComplains" object:nil];

 -(void)globalTakeMeToComplains 
      // here I have code for Transition to go to ComplainsViewController
 

在第 2 步中,当我们切换到第一个标签栏时,viewWillAppear 会在我正在收听通知的地方被调用。一旦我听到通知,我将执行到另一个视图控制器的转换。

如果有人不清楚我在做什么,请告诉我。

【讨论】:

以上是关于在导航到另一个视图控制器之前切换标签栏的主要内容,如果未能解决你的问题,请参考以下文章

在标签栏中的同一标签上切换视图而不使用导航控制器

是否可以从标签栏控制器导航到另一个标签栏控制器?

切换到另一个视图控制器时,如何保持标签栏可见? [关闭]

在 UITabBarController 中,如何从一个视图控制器切换到另一个视图控制器并保留标签栏?

将数据从标签栏开关直接传递到另一个视图控制器

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