如何创建全局导航堆栈?

时间:2012-02-14 14:22:03

标签: iphone objective-c cocoa-touch uinavigationcontroller uitabbarcontroller

我想要一个全局导航堆栈。当用户更改选项卡或导航到同一选项卡中的新视图时,我想将新视图推送到全局导航堆栈。我希望导航栏中的后退按钮返回上一个视图,该视图有时是不同的选项卡,有时在同一个选项卡中有不同的视图。

enter image description here

6 个答案:

答案 0 :(得分:4)

要实现此效果,您可以放弃UITabBarController - 并使用自定义视图或自定义标准UIToolbar来模拟栏。

有一个导航控制器,您的自定义工具栏始终可见,当点击按钮时,只需将您想要的视图推到导航堆栈。

答案 1 :(得分:0)

您可以通过将UINavigationController的左侧栏按钮设置为您选择的按钮来实现相同的目的,处理操作方法并在点击事件上调用相应的标签栏按钮。

您需要在根视图控制器中执行所有操作...

<强>增加:

只需按下标签栏按钮,就无法获得根视图控制器上的后退按钮(导航控制器;与您的标签栏实例关联的根视图)。

你需要找到实现这一目标的方法,因为你没有从iOS获得这一点所以按下tabbar按钮的动作你需要有一个存储前一个选定索引的变量和一个为任何tabbar提供信息的方法通过传递索引...所以通过使用这两个你可以设置导航栏的左栏按钮的标题,并通过向左栏按钮指定适当的操作方法返回到上一个选项卡...

答案 2 :(得分:0)

您希望UIViewController中的所有UITabBarController加载到同一UINavigationController吗?

这样的事情:

          ___ RootViewController ___
         |                           |
UINavigationController        UITabBarViewController

而不是

               RootViewController
                        |
     _________ UITabbarViewController _____________________
    |                           |                          |
UINavigationController   UINavigationController    UINavigationController

您应尝试使用自己的自定义UITabBar

进行“试验”

答案 3 :(得分:0)

我建议你创建一个包含NSInvocation对象的全局数组(NSMutableArray)。因此,每次推送视图控制器时,都需要创建NSInvocation,导航控制器作为目标,popViewConrollerAnimated:作为选择器。如果您点击标签栏项目,则需要将标签栏控制器设置为目标,将setSelectedViewController:设置为选择器。您还应使用

将当前视图控制器指定为参数
- (void)setArgument:(void *)buffer atIndex:(NSInteger)index

然后,每次弹出全局堆栈时,只需拨打[myLastInvocation invoke];

即可

答案 4 :(得分:0)

我有类似的问题。我是这样做的:

要更改标签,请使用:例如,您要转到标签2及其第3个视图控制器

self.tabBarController.selectedIndex = 2;

[self.tabBarController.delegate tabBarController:self.tabBarController didSelectViewController:
     [[[self.tabBarController.viewControllers objectAtIndex:2] viewControllers] objectAtIndex:3]];

答案 5 :(得分:0)

我得到了它的工作。根据我的经验,我需要mainTabBarControllerdetailedNavigationController作为两个根控制器。 UIApplicationDelegate类的这两种方法完美无缺:

- (void) showDetailedTab 
{
    CGRect normalRect = self.window.bounds;
    CGRect rightRect = CGRectOffset(normalRect, normalRect.size.width, 0);
    CGRect leftRect = CGRectOffset(normalRect, -normalRect.size.width, 0);

    detailedNavigationController.view.frame = rightRect;
    mainTabBarController.view.frame = normalRect;
    [self.window addSubview:mainTabBarController.view];
    [self.window addSubview:detailedNavigationController.view];

    [UIView animateWithDuration:0.35 delay:0.0 options:UIViewAnimationCurveEaseOut
                     animations: ^{
                         detailedNavigationController.view.frame = normalRect;
                         mainTabBarController.view.frame = leftRect;
                     } 
                     completion: ^(BOOL finished){
                         [mainTabBarController.view removeFromSuperview];
                     }];
}

- (void) showMainTabBar
{
    CGRect normalRect = self.window.bounds;
    CGRect rightRect = CGRectOffset(normalRect, normalRect.size.width, 0);
    CGRect leftRect = CGRectOffset(normalRect, -normalRect.size.width, 0);

    mainTabBarController.view.frame = leftRect;
    detailedNavigationController.view.frame = normalRect;
    [self.window addSubview:mainTabBarController.view];
    [self.window addSubview:detailedNavigationController.view];

    [UIView animateWithDuration:0.35 delay:0.0 options:UIViewAnimationCurveEaseOut
                     animations: ^{
                         mainTabBarController.view.frame = normalRect;
                         detailedNavigationController.view.frame = rightRect;
                     } 
                     completion: ^(BOOL finished){
                         [detailedNavigationController.view removeFromSuperview];
                     }];
}

我认为这个解决方案比模拟标签栏更好,因为它不会破坏UIViewContoller的生命周期。