导航到另一个viewcontroller

时间:2015-08-02 11:17:45

标签: ios objective-c uiviewcontroller uinavigationcontroller uitabbarcontroller

我正在创建一个iOS应用,我有 标签栏+侧边菜单

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

所有侧边菜单功能均来自标签1&可以在标签栏中的所有视图中访问侧边菜单。

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

我想要做的是,如果我点击侧面菜单中的Complains菜单,我想转到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上,点击侧边菜单中的Complains。当我点击时,我使用上面的代码成功转到ComplainsViewController。

场景2(正确)

我在Tab 2上,点击侧边菜单中的Complains。当我点击时,我成功进入选项卡1,但我没有导航到ComplainsViewController。当我单击返回选项卡2时,我看到在选项卡2中打开了ComplainsViewController。

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

编辑1

以下是我的基本结构。

enter image description here

2 个答案:

答案 0 :(得分:3)

在切换标签后,您似乎忘记切换planets <- c("Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"); str(factor(planets)) 了。 尝试实施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];

答案 1 :(得分:3)

最后,我设法用另一种方式解决了 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。听到通知后,我将执行到另一个视图控制器的转换。

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