在导航到另一个视图控制器之前切换标签栏
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 会在我正在收听通知的地方被调用。一旦我听到通知,我将执行到另一个视图控制器的转换。
如果有人不清楚我在做什么,请告诉我。
【讨论】:
以上是关于在导航到另一个视图控制器之前切换标签栏的主要内容,如果未能解决你的问题,请参考以下文章