在导航到另一个标签栏之前切换标签栏 viewcontroller

switch tab bar before navigation to another viewcontroller

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

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

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

这意味着如果我在选项卡 2 上,即使我可以访问侧面菜单。当我单击选项卡 1 中的侧边菜单项时,我将转到选项卡 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 时,我看到 ComplainsViewController 在选项卡 2 中打开。

知道如何先切换到 Tab 然后导航到另一个 viewcontroller?


编辑 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

最后我设法通过使用NSNotificationCenter[=以另一种方式解决了它34=]

下面是我做的。

Step 1 (In 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 和 post 通知。

Step 2 (In all other view controllers)

[[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 在我收听通知的地方被调用。一旦听到通知,我将执行到另一个视图控制器的转换。

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